2025-10-14 15:10:55 -05:00
#!/usr/bin/env python3
2025-01-27 07:58:36 -06:00
import os
import sys
2025-11-18 16:26:08 -06:00
import time
2025-10-14 15:10:55 -05:00
from pathlib import Path
2025-01-27 07:58:36 -06:00
2025-10-14 15:10:55 -05:00
REPO_ROOT = Path ( __file__ ) . parent . parent . parent
2025-01-27 07:58:36 -06:00
sys . path . append ( str ( REPO_ROOT ) )
# This script should be careful not to disrupt automatic mechanism which
# may be expecting certain stdout, always print to stderr.
sys . stdout = sys . stderr
from bazel . wrapper_hook . install_modules import install_modules
from bazel . wrapper_hook . wrapper_debug import wrapper_debug
2025-11-19 14:24:55 -08:00
from bazel . wrapper_hook . wrapper_util import get_terminal_stream
2025-01-27 07:58:36 -06:00
wrapper_debug ( f " wrapper hook script is using { sys . executable } " )
2025-11-18 16:26:08 -06:00
def _supports_color ( stream ) :
if os . name == " nt " :
return False
if os . environ . get ( " NO_COLOR " ) :
return False
try :
return stream . isatty ( )
except Exception :
return False
def _info_prefix ( stream ) :
if _supports_color ( stream ) :
GREEN = " \x1b [0;32m "
RESET = " \x1b [0m "
return f " { GREEN } INFO { RESET } : "
return " INFO: "
def _fmt_duration ( seconds : float ) - > str :
return f " { seconds * 1000 : .1f } ms " if seconds < 1 else f " { seconds : .3f } s "
def _info ( msg : str , printer = print , stream = None ) :
term_err = get_terminal_stream ( " MONGO_WRAPPER_STDERR_FD " )
# Save current stdout/stderr
old_stdout = sys . stdout
old_stderr = sys . stderr
try :
sys . stdout = term_err
sys . stderr = term_err
stream = stream or sys . stdout
prefix = _info_prefix ( stream )
printer ( f " { prefix } { msg } " )
finally :
# Restore original stdout/stderr to whatever wrapper has
sys . stdout = old_stdout
sys . stderr = old_stderr
2025-11-19 14:24:55 -08:00
def run_with_terminal_output ( func , * args , * * kwargs ) :
term_err = get_terminal_stream ( " MONGO_WRAPPER_STDERR_FD " )
sys . stdout = None
# Save current stdout/stderr
old_stdout = sys . stdout
old_stderr = sys . stderr
try :
sys . stdout = term_err
sys . stderr = term_err
return func ( * args , * * kwargs )
finally :
# Restore original stdout/stderr to whatever wrapper has
sys . stdout = old_stdout
sys . stderr = old_stderr
2025-01-27 07:58:36 -06:00
def main ( ) :
2025-07-30 13:54:02 -07:00
install_modules ( sys . argv [ 1 ] , sys . argv [ 1 : ] )
2025-01-27 07:58:36 -06:00
2025-11-18 16:26:08 -06:00
from bazel . auto_header . auto_header import gen_auto_headers
2025-10-14 15:10:55 -05:00
from bazel . auto_header . gen_all_headers import spawn_all_headers_thread
2025-02-14 10:35:12 -08:00
from bazel . wrapper_hook . autogenerated_targets import autogenerate_targets
2025-11-07 13:54:06 -05:00
from bazel . wrapper_hook . check_resources import check_resource
2025-01-28 21:05:00 -06:00
from bazel . wrapper_hook . engflow_check import engflow_auth
2025-05-19 08:54:19 -07:00
from bazel . wrapper_hook . generate_common_bes_bazelrc import write_workstation_bazelrc
2025-11-06 14:42:32 -05:00
# from bazel.wrapper_hook.git_age_check import check as git_age_check
2025-08-20 12:28:06 -07:00
from bazel . wrapper_hook . lint import LinterFail
2025-04-10 16:49:40 -05:00
from bazel . wrapper_hook . plus_interface import check_bazel_command_type , test_runner_interface
2025-11-25 09:45:07 -05:00
from bazel . wrapper_hook . write_wrapper_hook_bazelrc import write_wrapper_hook_bazelrc
2025-01-28 21:05:00 -06:00
2025-11-18 16:26:08 -06:00
th_all_header , hdr_state_all_header = spawn_all_headers_thread ( REPO_ROOT )
# Join the header generator before finalizing args.
start = time . perf_counter ( )
auto_hdr_state = gen_auto_headers ( REPO_ROOT )
th_all_header . join ( )
if hdr_state_all_header [ " ok " ] :
wrapper_debug ( f ' ( { " wrote " if hdr_state_all_header [ " wrote " ] else " nochange " } ) ' )
else :
print ( f ' [all_headers] failed: { hdr_state_all_header [ " err " ] !r} ' )
if auto_hdr_state [ " ok " ] :
wrapper_debug ( f ' ( { " wrote " if auto_hdr_state [ " wrote " ] else " nochange " } ) ' )
else :
print ( f ' [auto_headers] failed: { auto_hdr_state [ " err " ] !r} ' )
t_total_s = time . perf_counter ( ) - start
_info ( f " auto_header build generated: { _fmt_duration ( t_total_s ) } " )
2025-10-14 15:10:55 -05:00
2025-02-14 10:35:12 -08:00
# This is used to autogenerate a BUILD.bazel that creates
# Filegroups for select tags - used to group targets for installing
autogenerate_targets ( sys . argv , sys . argv [ 1 ] )
2025-06-04 11:04:24 -07:00
enterprise = True
2025-11-26 11:06:20 -06:00
atlas = True
2025-04-10 16:49:40 -05:00
if check_bazel_command_type ( sys . argv [ 1 : ] ) not in [ " clean " , " shutdown " , " version " , None ] :
args = sys . argv
enterprise_mod = REPO_ROOT / " src " / " mongo " / " db " / " modules " / " enterprise "
if not enterprise_mod . exists ( ) :
2025-06-04 11:04:24 -07:00
enterprise = False
2025-04-10 16:49:40 -05:00
print (
2025-08-12 10:56:10 -05:00
f " { enterprise_mod . relative_to ( REPO_ROOT ) . as_posix ( ) } missing, defaulting to local non-enterprise build (--config=local --//bazel/config:build_enterprise=False). Add the directory to not automatically add these options. "
2025-04-10 16:49:40 -05:00
)
2025-08-12 10:56:10 -05:00
args + = [ " --//bazel/config:build_enterprise=False " , " --config=local " ]
2025-04-10 16:49:40 -05:00
2025-07-31 20:19:45 -05:00
atlas_mod = REPO_ROOT / " src " / " mongo " / " db " / " modules " / " atlas "
if not atlas_mod . exists ( ) :
2025-11-26 11:06:20 -06:00
atlas = False
2025-08-12 10:56:10 -05:00
args + = [ " --//bazel/config:build_atlas=False " ]
2025-07-31 20:19:45 -05:00
2025-10-15 14:59:48 -05:00
if any ( arg . startswith ( " --include_mongot " ) for arg in args ) :
os . makedirs ( " mongot-localdev " , exist_ok = True )
2025-04-10 16:49:40 -05:00
engflow_auth ( args )
write_workstation_bazelrc ( args )
2025-11-25 09:45:07 -05:00
write_wrapper_hook_bazelrc ( args )
2025-11-06 14:42:32 -05:00
# Disable git age check for now, to avoid issues wth merge commits
# git_age_check()
2025-11-07 13:54:06 -05:00
check_resource ( )
2025-07-31 14:04:27 -05:00
2025-08-20 12:28:06 -07:00
try :
2025-11-19 14:24:55 -08:00
args = run_with_terminal_output (
test_runner_interface ,
2025-11-26 11:06:20 -06:00
args [ 1 : ] ,
2025-08-20 12:28:06 -07:00
autocomplete_query = os . environ . get ( " MONGO_AUTOCOMPLETE_QUERY " ) == " 1 " ,
enterprise = enterprise ,
2025-11-26 11:06:20 -06:00
atlas = atlas ,
2025-08-20 12:28:06 -07:00
)
except LinterFail :
# Linter fails preempt bazel run.
sys . exit ( 3 )
2025-04-10 16:49:40 -05:00
else :
args = sys . argv [ 2 : ]
2025-01-27 07:58:36 -06:00
os . chmod ( os . environ . get ( " MONGO_BAZEL_WRAPPER_ARGS " ) , 0o644 )
with open ( os . environ . get ( " MONGO_BAZEL_WRAPPER_ARGS " ) , " w " ) as f :
2025-01-28 21:05:00 -06:00
f . write ( " \n " . join ( args ) )
f . write ( " \n " )
2025-01-27 07:58:36 -06:00
if __name__ == " __main__ " :
main ( )