d947dcc75b04fd0dc921c0eb02ed988d7b4819f0
braney
  Mon Jun 30 16:00:56 2025 -0700
let genark hubs appear in hgConvert if we can figure out their UCSC org

diff --git src/hg/lib/hdb.c src/hg/lib/hdb.c
index be2d9ceb980..b381d3e0df5 100644
--- src/hg/lib/hdb.c
+++ src/hg/lib/hdb.c
@@ -353,30 +353,38 @@
 
 struct sqlConnection *conn = hConnectCentral();
 char buf[128];
 char query[256];
 sqlSafef(query, sizeof(query), "select name from %s where name = '%s'",dbDbTable(),  database);
 boolean res = (sqlQuickQuery(conn, query, buf, sizeof(buf)) != NULL);
 if (res)
     {
     // this is done instead of sqlDatabaseExists() since it uses the cache,
     // which will recycle free connections for new databases
     struct sqlConnection *conn2 = hAllocConnMaybe(database);
     res = (conn2 != NULL);
     hFreeConn(&conn2);
     }
 hDisconnectCentral(&conn);
+
+#ifdef NTONOW
+if ((res == FALSE) && cfgOptionBooleanDefault("genarkLiftOver", FALSE))
+    {
+    if (genarkUrl(database) != NULL)
+        res = TRUE;
+    }
+#endif
 hashAddInt(dbsChecked, database, res);
 return res;
 }
 
 boolean hDbIsActive(char *database)
 /* Function to check if this is a valid and active db name */
 {
 static struct hash *dbsChecked = NULL;
 
 if (dbsChecked)
     {
     void *hashDb = hashFindVal(dbsChecked, database);
     if (hashDb)
 	return(hashIntVal(dbsChecked, database));
     }
@@ -2580,31 +2588,35 @@
 char *res = NULL;
 
 sqlSafef(query, sizeof(query), "select %s from %s where name = '%s'",
       field, dbDbTable(), database);
 if (sqlQuickQuery(conn, query, buf, sizeof(buf)) != NULL)
     res = cloneString(buf);
 
 hDisconnectCentral(&conn);
 return res;
 }
 
 
 char *hDbDbOptionalField(char *database, char *field)
  /* Look up in the regular central database. */
 {
-if (trackHubDatabase(database) && !hubConnectIsCurated(trackHubSkipHubName(database)))
+boolean isGenark = FALSE;
+//if (genarkUrl(database) != NULL)
+//    isGenark = TRUE;
+
+if (isGenark || (trackHubDatabase(database) && !hubConnectIsCurated(trackHubSkipHubName(database))))
     {
     // In dbDb the genome field is the name of the organism, but
     // genome is the name of the assembly in track hubs.
     // Since we're called from dbDb aware code, we map a request
     // for the field "genome" to "organism"
     if (sameString(field, "genome"))
 	field = "organism";
     return trackHubAssemblyField(database, field);
     }
 
 char *res = hCentralDbDbOptionalField(trackHubSkipHubName(database), field);
 
 return res;
 }
 
@@ -4956,51 +4968,66 @@
 }
 
 struct dbDb *hGetLiftOverToDatabases(char *fromDb)
 /* Get list of databases for which there are liftOver chain files
  * to convert from the fromDb assembly.
  * Dispose of this with dbDbFreeList. */
 {
 struct dbDb *allDbList = NULL, *liftOverDbList = NULL, *dbDb, *nextDbDb;
 struct liftOverChain *chainList = NULL, *chain;
 struct hash *hash = newHash(0);
 struct hash *dbNameHash = newHash(3);
 
 /* Get list of all liftOver chains in central database */
 chainList = liftOverChainListForDbFiltered(fromDb);
 
+struct dyString *dy = newDyString(4096);
 /* Create hash of databases having liftOver chains from the fromDb */
 for (chain = chainList; chain != NULL; chain = chain->next)
     if (sameString(chain->fromDb,fromDb))
+        {
 	hashAdd(hash, chain->toDb, chain->toDb);
+        if (startsWith("GC", chain->toDb))
+            {
+            dyStringPrintf(dy, "'%s',", chain->toDb);
+            }
+        }
 
 /* Get list of all current databases */
 allDbList = hDbDbListDeadOrAlive();
 
 /* Create a new dbDb list of all entries in the liftOver hash */
 for (dbDb = allDbList; dbDb != NULL; dbDb = nextDbDb)
     {
     nextDbDb = dbDb->next;
     if (hashFindVal(hash, dbDb->name) && !hashFindVal(dbNameHash, dbDb->name))
 	{
         slAddHead(&liftOverDbList, dbDb);
 	/* to avoid duplicates in the returned list. */
 	hashAdd(dbNameHash, dbDb->name, dbDb->name);
 	}
     else
         dbDbFree(&dbDb);
     }
+
+if (cfgOptionBooleanDefault("genarkLiftOver", FALSE) && (strlen(dy->string) > 0))
+    {
+    dy->string[strlen(dy->string) - 1] = 0;
+    struct dbDb *genarkDbDbs = genarkLiftOverDbs(dy->string);
+    liftOverDbList = slCat(genarkDbDbs, liftOverDbList);
+    }
+
 hashFree(&hash);
 liftOverChainFreeList(&chainList);
 
 /* sort by orderKey so that assemblies always appear from most recent */
 /* to the oldest assemblies in the dropdown menu for toDbs */
 slSort(&liftOverDbList, hDbDbCmpOrderKey);
 return liftOverDbList;
 }
 
 struct dbDb *hGetBlatIndexedDatabases()
 /* Get list of databases for which there is a BLAT index.
  * Dispose of this with dbDbFreeList. */
 {
 struct hash *hash=newHash(5);
 struct sqlConnection *conn = hConnectCentral();