5f7a14fde8cdb24b01fc0e5eadba145bfd9ecb04
max
  Sat Jul 25 23:16:06 2026 -0700
hgLogin: social login (Google/ORCID), email login link, change email. refs #37929

diff --git src/hg/hgMenubar/hgMenubar.c src/hg/hgMenubar/hgMenubar.c
index 2302170fca7..c4169b593b0 100644
--- src/hg/hgMenubar/hgMenubar.c
+++ src/hg/hgMenubar/hgMenubar.c
@@ -29,34 +29,37 @@
     return cloneString("");
 struct dyString *dy = dyStringNew(512);
 char *userName = wikiLinkUserName();
 if (userName == NULL)
     {
     // Link straight to the login page (absolute URL from wikiLink), not through hgSession.
     char *loginUrl = wikiLinkUserLoginUrl("");
     dyStringPrintf(dy, "<a class='topRightLink' href=\"%s\" id='loginLink' "
         "title='Log in to save and share sessions'>Login</a>", loginUrl);
     }
 else
     {
     // No hgsid available on static pages; the logout return URL simply omits it.
     char *logoutUrl = wikiLinkUserLogoutUrl("");
     char *changePwUrl = wikiLinkChangePasswordUrl("");
+    char *changeEmailUrl = wikiLinkChangeEmailUrl("");
     dyStringPrintf(dy, "<a class='topRightLink' href='#' id='loginLink' "
         "title='Account info and sign out' "
-        "data-username=\"%s\" data-logouturl=\"%s\" data-changepwurl=\"%s\">%s</a>",
-        userName, logoutUrl, changePwUrl ? changePwUrl : "", userName);
+        "data-username=\"%s\" data-logouturl=\"%s\" data-changepwurl=\"%s\" "
+        "data-changeemailurl=\"%s\">%s</a>",
+        userName, logoutUrl, changePwUrl ? changePwUrl : "",
+        changeEmailUrl ? changeEmailUrl : "", userName);
     }
 return dyStringCannibalize(&dy);
 }
 
 char *incFilePath(char *cgiPath, char *filePath, char *docRoot)
 /* Replace CGI_NAME in cgiPath with docRoot/filePath.  filePath must begin with "/" eg "/inc/..." */
 {
 char *incPath = replaceChars(cgiPath, "/"CGI_NAME, filePath);
 return catTwoStrings(docRoot, incPath);
 }
 
 void printIncludes(char* baseDir, char *docRoot)
 {
 // Cache-buster for the menu-bar CSS/JS: append ?v=<file mtime> so browsers refetch these when
 // they change instead of serving a stale cached copy (the CGIs get this from