c3fc03a88ff8fcd8fffadcdd960693268c2a6f5f
hiram
  Thu May 14 11:43:43 2026 -0700
correctly use a dedicated clean otto kent source tree for operations in the source tree refs #31811

diff --git src/hg/utils/otto/userRequests/ottoBuildGenArkHub.py src/hg/utils/otto/userRequests/ottoBuildGenArkHub.py
index 8d0d5e540f7..3b2771f0512 100755
--- src/hg/utils/otto/userRequests/ottoBuildGenArkHub.py
+++ src/hg/utils/otto/userRequests/ottoBuildGenArkHub.py
@@ -96,30 +96,34 @@
     # keep ref alive for the lifetime of the process
     _ = lockFh
 
     genarkInfo = ottoLib.lookupGenark(accessions)
     for acc in accessions:
         if acc not in genarkInfo:
             print("WARNING: %s not in genark table - skipping"
                   % acc, file=sys.stderr)
 
     grouped = ottoLib.groupByClade(set(genarkInfo.keys()), {}, genarkInfo)
     if not grouped:
         print("ERROR: nothing to do - no accessions resolved to a clade",
               file=sys.stderr)
         sys.exit(1)
 
+    # bring the otto kent tree up to date before any cladeAsmHub make
+    if not ottoLib.gitPullKentTree():
+        sys.exit(1)
+
     # doTrackDb runs first: it refreshes per-asm trackDb stanzas that the
     # downstream make chain then bakes into the hub files.  An asm whose
     # doTrackDb fails is dropped from this build pass (the make chain
     # would otherwise bake stale or broken trackDb into the hub files);
     # a clade whose every asm fails doTrackDb is dropped entirely.
     doTdbFailures = []
     for clade in sorted(grouped):
         survivors = []
         for asmId in grouped[clade]:
             if ottoLib.runDoTrackDb(asmId, logPath=doTdbLog):
                 survivors.append(asmId)
             else:
                 doTdbFailures.append(asmId)
                 print("# WARNING: doTrackDb failed for %s - dropping "
                       "from this build pass" % asmId, file=sys.stderr)