blob: e14340b3d80e71a9771a254bb8d6d81cd97cf054 [file] [log] [blame]
#!/usr/bin/env python3
# allow-non-vendored-python
# Copyright 2025 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This script is used to set up a cog-based workspace for Fuchsia development.
It is currently highly experimental and not guaranteed to work.
"""
import argparse
import logging
import sys
import cartfs
import cartfs_out_directory
import logger
import prebuilts
import workspace
def prepare_workspace_instance(
disable_snapshot: bool,
use_local_mock_cartfs: bool,
) -> workspace.Workspace | None:
"""Prepares a workspace instance."""
# Attempt to identify the current cog and associated cartfs workspace.
try:
workspace_instance = workspace.Workspace.create(use_local_mock_cartfs)
except workspace.NotInCogWorkspaceError:
logger.log_error("This script can only be run in cog workspaces.")
logger.log_error(
"Please refer to https://go/fuchsia-cog-user-guide for instructions on fuchsia development with cog."
)
return
except cartfs.CartfsError as e:
logger.log_exception(e)
return
logger.log_info(f"Found workspace dir: {workspace_instance.workspace_dir}")
logger.log_info(
f"Found cartfs mount point: {workspace_instance.cartfs_instance.mount_point}"
)
logger.log_info(f"Repository name: {workspace_instance.repo_name}")
# No need to reinitialize our cartfs workspace.
if workspace_instance.cartfs_workspace_dir:
logger.log_info(
f"Workspace is already linked to cartfs: {workspace_instance.cartfs_workspace_dir}"
)
return workspace_instance
# Attempt to snapshot the cartfs workspace from a previous instance.
cartfs_workspace_dir = None
if not disable_snapshot:
logger.log_info(
"Workspace is not linked to cartfs. Attempting to Snapshot from previous instance."
)
cartfs_workspace_dir = (
workspace_instance.snapshot_from_previous_instance(
use_local_mock_cartfs=use_local_mock_cartfs
)
)
if not cartfs_workspace_dir:
logger.log_info(
"Unable to snapshot from previous instance. Creating a new"
" cartfs workspace directory instead."
)
# Initialize an empty cartfs workspace directory.
if not cartfs_workspace_dir:
cartfs_workspace_dir = (
workspace_instance.create_empty_cartfs_workspace_directory()
)
workspace_instance.link_to_cartfs(cartfs_workspace_dir)
return workspace_instance
def _parse_args() -> argparse.Namespace:
"""Parses command-line arguments."""
parser = argparse.ArgumentParser(
description="Set up a cog-based workspace for Fuchsia development."
)
parser.add_argument(
"--no-snapshot",
dest="disable_snapshot",
action="store_true",
help="Disable snapshotting and initialize this workspace from scratch.",
)
parser.add_argument(
"--local-mock-cartfs",
dest="use_local_mock_cartfs",
action="store_true",
help="Use a local mock cartfs directory located at ~/mock_cartfs.",
)
parser.add_argument(
"-v",
"--verbose",
action="count",
default=0,
help="Increase verbosity level (-v for INFO, -vv for DEBUG).",
)
return parser.parse_args()
def main() -> int | None:
"""Main function to set up the cog workspace."""
args = _parse_args()
if args.verbose == 1:
log_level = logging.INFO
elif args.verbose >= 2:
log_level = logging.DEBUG
else:
log_level = logging.WARNING
logger.init_logger(level=log_level, colors=True)
workspace_instance = prepare_workspace_instance(
args.disable_snapshot, args.use_local_mock_cartfs
)
if not workspace_instance:
logger.log_warn("Could not create workspace instance.")
return 1
# TODO: Move this logic into the workspace instance.
prebuilts_manager = prebuilts.Prebuilts(
str(workspace_instance.cartfs_workspace_dir),
str(workspace_instance.workspace_dir),
workspace_instance.workspace_name,
workspace_instance.repo_name,
)
if not prebuilts_manager.is_jiri_bootstrapped():
prebuilts_manager.bootstrap_jiri()
prebuilts_manager.cartfs_structure_initialization()
prebuilts_manager.fetch_prebuilts()
prebuilts_manager.create_symlinks()
# Install/update cartfs-backed out directory.
cartfs_out_directory.CartfsOutDirectory(
cog_workspace_dir=workspace_instance.workspace_dir
/ workspace_instance.repo_name,
cartfs_workspace_dir=workspace_instance.cartfs_workspace_dir,
).apply()
if __name__ == "__main__":
sys.exit(main())