| #!/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 |
| ### 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) |