| #!/usr/bin/env fuchsia-vendored-python | |
| # Copyright 2022 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. | |
| #### CATEGORY=Code submission and review | |
| #### PREBUILTS=${PREBUILT_PYTHON3} | |
| ### Print the gerrit review URL and attempts to open it in the user's default browser. | |
| ## Usage: fx cl | |
| import subprocess | |
| import sys | |
| import os | |
| import shlex | |
| import configparser | |
| def OpenInDefaultBrowser(url): | |
| """ | |
| Attempts to open `url` in the default web browser. | |
| """ | |
| if not sys.platform.startswith("linux"): | |
| return | |
| # To open a browser we can't use python's webbrowser module or even `xdg-open`, because | |
| # those requires certain environment variables to be set, and `fx` cleans up | |
| # the environment variables before running this script. | |
| # Instead, we look at the xdg-settings: | |
| # xdg-settings returns the name of a .desktop file (e.g. "google-chrome.desktop"), | |
| # that is located in "/usr/share/applications". | |
| # By parsing that .desktop file, we are able to obtain a command that launches the | |
| # default browser. | |
| try: | |
| # 1. Get the default browser's .desktop file name | |
| result = subprocess.run( | |
| ["xdg-settings", "get", "default-web-browser"], | |
| capture_output=True, | |
| text=True, | |
| check=True, | |
| ) | |
| desktop_file_name = result.stdout.strip() | |
| # 2. Locate the .desktop file in standard XDG directory | |
| desktop_file_path = f"/usr/share/applications/{desktop_file_name}" | |
| # 3. Parse the .desktop file | |
| parser = configparser.ConfigParser(interpolation=None) | |
| # Read the file and get the 'Exec' command from the 'Desktop Entry' section | |
| parser.read(desktop_file_path) | |
| exec_command = None | |
| if parser.has_option("Desktop Entry", "Exec"): | |
| exec_command = parser.get("Desktop Entry", "Exec") | |
| else: | |
| print(f"Error: 'Exec' key not found in '{desktop_file_path}'") | |
| return | |
| # 4. Craft and execute the command to open the url in the browser | |
| # As per the "Desktop Entry Spec" (https://specifications.freedesktop.org/desktop-entry-spec/latest/exec-variables.html) | |
| # the exec command from the .desktop file can optionally contain %U or %u. | |
| # For example: "/usr/bin/google-chrome-stable %U". | |
| # Strip those optional arguments away to get the path to the executable. | |
| command_parts = shlex.split(exec_command) | |
| path_to_brower = command_parts[0] | |
| subprocess.run( | |
| [path_to_brower, url], | |
| capture_output=True, | |
| text=True, | |
| check=True, | |
| ) | |
| except Exception as e: | |
| print(f"An unexpected error occurred: {e}") | |
| def GetChangeId(): | |
| """ | |
| Attempts to obtain the change ID from the last commit. | |
| Returns an empty string if it fails. | |
| """ | |
| change_id = None | |
| try: | |
| # Gets the description of the last commit | |
| commit_msg = subprocess.check_output( | |
| ["git", "log", "-1", '--format="%B"', "HEAD"], text=True | |
| ) | |
| prefix = "Change-Id:" | |
| for l in commit_msg.splitlines(): | |
| if l.startswith(prefix): | |
| change_id = l[len(prefix) :].strip() | |
| except: | |
| return None | |
| return change_id | |
| # Opens the current CL in the web browser. | |
| change_id = GetChangeId() | |
| if change_id is None: | |
| print("No change ID found", file=sys.stderr) | |
| sys.exit(1) | |
| url = f"https://fxrev.dev/{change_id}" | |
| # If we can't manage to open the url at least we'll have printed the URL, which will | |
| # be clickable in some terminals. | |
| print(url) | |
| OpenInDefaultBrowser(url) |