[tor-commits] [Git][tpo/applications/tor-browser][tor-browser-128.3.0esr-14.0-1] fixup! Bug 41803: Add some developer tools for working on tor-browser.

Pier Angelo Vendrame (@pierov) git at gitlab.torproject.org
Mon Sep 30 15:15:14 UTC 2024



Pier Angelo Vendrame pushed to branch tor-browser-128.3.0esr-14.0-1 at The Tor Project / Applications / Tor Browser


Commits:
38fb3e3e by Henry Wilkes at 2024-09-30T15:40:40+01:00
fixup! Bug 41803: Add some developer tools for working on tor-browser.

Bug 43157: Move tb-dev to base browser and add support for working in
mullvad-browser.

Also improve error handling and lint the file.

- - - - -


2 changed files:

- tools/torbrowser/git-rebase-fixup-preprocessor → tools/base-browser/git-rebase-fixup-preprocessor
- tools/torbrowser/tb-dev → tools/base-browser/tb-dev


Changes:

=====================================
tools/torbrowser/git-rebase-fixup-preprocessor → tools/base-browser/git-rebase-fixup-preprocessor
=====================================


=====================================
tools/torbrowser/tb-dev → tools/base-browser/tb-dev
=====================================
@@ -4,27 +4,38 @@
 Useful tools for working on tor-browser repository.
 """
 
-import sys
-import termios
-import os
+import argparse
 import atexit
-import tempfile
-import subprocess
-import re
 import json
+import os
+import re
+import subprocess
+import sys
+import tempfile
+import termios
 import urllib.request
-import argparse
+
 import argcomplete
 
 GIT_PATH = "/usr/bin/git"
-UPSTREAM_URLS = [
-    "https://gitlab.torproject.org/tpo/applications/tor-browser.git",
-    "git at gitlab.torproject.org:tpo/applications/tor-browser.git",
-]
+UPSTREAM_URLS = {
+    "tor-browser": [
+        "https://gitlab.torproject.org/tpo/applications/tor-browser.git",
+        "git at gitlab.torproject.org:tpo/applications/tor-browser.git",
+    ],
+    "mullvad-browser": [
+        "https://gitlab.torproject.org/tpo/applications/mullvad-browser.git",
+        "git at gitlab.torproject.org:tpo/applications/mullvad-browser.git",
+    ],
+}
 FIXUP_PREPROCESSOR_EDITOR = "git-rebase-fixup-preprocessor"
 USER_EDITOR_ENV_NAME = "GIT_REBASE_FIXUP_PREPROCESSOR_USER_EDITOR"
 
 
+class TbDevException(Exception):
+    pass
+
+
 def git_run(args, check=True, env=None):
     """
     Run a git command with output sent to stdout.
@@ -34,16 +45,22 @@ def git_run(args, check=True, env=None):
         for key, value in env.items():
             tmp_env[key] = value
         env = tmp_env
-    subprocess.run([GIT_PATH, *args], check=check, env=env)
+    try:
+        subprocess.run([GIT_PATH, *args], check=check, env=env)
+    except subprocess.CalledProcessError as err:
+        raise TbDevException(str(err)) from err
 
 
 def git_get(args):
     """
     Run a git command with each non-empty line returned in a list.
     """
-    git_process = subprocess.run(
-        [GIT_PATH, *args], text=True, stdout=subprocess.PIPE, check=True
-    )
+    try:
+        git_process = subprocess.run(
+            [GIT_PATH, *args], text=True, stdout=subprocess.PIPE, check=True
+        )
+    except subprocess.CalledProcessError as err:
+        raise TbDevException(str(err)) from err
     return [line for line in git_process.stdout.split("\n") if line]
 
 
@@ -57,35 +74,68 @@ def get_local_root():
     global local_root
     if local_root is None:
         try:
-            # Make sure we have a matching remote in this git repository. Should raise Exception if we don't.
-            get_upstream_name()
-            git_root = git_get(["rev-parse", "--show-toplevel"])[0]
-        except Exception:
-            git_root = None
-        if git_root is None:
+            # Make sure we have a matching remote in this git repository.
+            if get_upstream_details()["is-browser-repo"]:
+                local_root = git_get(["rev-parse", "--show-toplevel"])[0]
+            else:
+                local_root = ""
+        except TbDevException:
             local_root = ""
-        else:
-            local_root = git_root
     return local_root
 
 
-upstream_name = None
+def determine_upstream_details():
+    """
+    Determine details about the upstream.
+    """
+    remote_urls = {
+        remote: git_get(["remote", "get-url", remote])[0]
+        for remote in git_get(["remote"])
+    }
+
+    matches = {
+        remote: repo
+        for repo, url_list in UPSTREAM_URLS.items()
+        for url in url_list
+        for remote, fetch_url in remote_urls.items()
+        if fetch_url == url
+    }
+
+    is_browser_repo = len(matches) > 0
+    details = {"is-browser-repo": is_browser_repo}
 
+    origin_remote_repo = matches.get("origin", None)
+    upstream_remote_repo = matches.get("upstream", None)
 
-def get_upstream_name():
+    if origin_remote_repo is not None:
+        if upstream_remote_repo is None:
+            details["remote"] = "origin"
+            details["repo-name"] = origin_remote_repo
+        # Else, both "upstream" and "origin" point to a remote repo. Not clear
+        # which should be used.
+    elif upstream_remote_repo is not None:
+        details["remote"] = "upstream"
+        details["repo-name"] = upstream_remote_repo
+    elif len(matches) == 1:
+        remote = next(iter(matches.keys()))
+        details["remote"] = remote
+        details["repo-name"] = matches[remote]
+    # Else, the upstream is ambiguous.
+
+    return details
+
+
+cached_upstream_details = None
+
+
+def get_upstream_details():
     """
-    Get the name of the upstream remote.
+    Get details about the upstream repository.
     """
-    global upstream_name
-    if upstream_name is None:
-        for remote in git_get(["remote"]):
-            fetch_url = git_get(["remote", "get-url", remote])[0]
-            if fetch_url in UPSTREAM_URLS:
-                upstream_name = remote
-                break
-        if upstream_name is None:
-            raise Exception("No upstream remote found.")
-    return upstream_name
+    global cached_upstream_details
+    if cached_upstream_details is None:
+        cached_upstream_details = determine_upstream_details()
+    return cached_upstream_details
 
 
 class Reference:
@@ -139,7 +189,7 @@ def get_nearest_ref(ref_type, name_start, search_from):
             if commit == ref.commit:
                 return ref
 
-    raise Exception(f"No {name_start} commit found in the last 1000 commits")
+    raise TbDevException(f"No {name_start} commit found in the last 1000 commits")
 
 
 def get_firefox_ref(search_from):
@@ -167,7 +217,7 @@ def get_upstream_basis_commit(search_from):
     upstream_firefox = get_firefox_ref(upstream_branch).commit
     search_firefox = get_firefox_ref(search_from).commit
     if upstream_firefox != search_firefox:
-        raise Exception(
+        raise TbDevException(
             f"Upstream of {search_from} has a different FIREFOX base. "
             "You might want to set the upstream tracking branch to a new value."
         )
@@ -210,12 +260,15 @@ def get_gitlab_default():
     """
     Get the name of the default branch on gitlab.
     """
-    query = """
-      query {
-        project(fullPath: "tpo/applications/tor-browser") {
-          repository { rootRef }
-        }
-      }
+    repo_name = get_upstream_details().get("repo-name", None)
+    if repo_name is None:
+        raise TbDevException("Cannot determine the repository name")
+    query = f"""
+      query {{
+        project(fullPath: "tpo/applications/{repo_name}") {{
+          repository {{ rootRef }}
+        }}
+      }}
     """
     request_data = {"query": re.sub(r"\s+", "", query)}
     gitlab_request = urllib.request.Request(
@@ -231,7 +284,7 @@ def get_gitlab_default():
         return json.load(response)["data"]["project"]["repository"]["rootRef"]
 
 
-def within_tor_browser_root():
+def within_browser_root():
     """
     Whether we are with the tor browser root.
     """
@@ -279,7 +332,7 @@ def show_files_containing(args):
     try:
         regex = re.compile(args.regex)
     except re.error as err:
-        raise Exception(f"{args.regex} is not a valid python regex") from err
+        raise TbDevException(f"{args.regex} is not a valid python regex") from err
 
     file_list = get_changed_files(get_firefox_ref("HEAD").commit)
 
@@ -428,7 +481,7 @@ def auto_fixup(_args):
 
     staged_files = get_changed_files("HEAD", staged=True)
     if staged_files:
-        raise Exception(f"Have already staged files: {staged_files}")
+        raise TbDevException(f"Have already staged files: {staged_files}")
 
     fixups = {}
     for filename in get_changed_files("HEAD"):
@@ -475,7 +528,9 @@ def show_default(_args):
     Print the default branch name from gitlab.
     """
     default_branch = get_gitlab_default()
-    upstream = get_upstream_name()
+    upstream = get_upstream_details().get("remote", None)
+    if upstream is None:
+        raise TbDevException("Cannot determine the upstream remote")
     print(f"{upstream}/{default_branch}")
 
 
@@ -484,10 +539,20 @@ def branch_from_default(args):
     Fetch the default gitlab branch from upstream and create a new local branch.
     """
     default_branch = get_gitlab_default()
-    upstream = get_upstream_name()
+    upstream = get_upstream_details().get("remote", None)
+    if upstream is None:
+        raise TbDevException("Cannot determine the upstream remote")
 
     git_run(["fetch", upstream, default_branch])
-    git_run(["switch", "--create", args.branchname, "--track", f"{upstream}/{default_branch}"])
+    git_run(
+        [
+            "switch",
+            "--create",
+            args.branchname,
+            "--track",
+            f"{upstream}/{default_branch}",
+        ]
+    )
 
 
 def move_to_default(args):
@@ -504,17 +569,21 @@ def move_to_default(args):
         try:
             branch_name = git_get(["branch", "--show-current"])[0]
         except IndexError:
-            raise Exception("No current branch")
+            raise TbDevException("No current branch")
 
     current_upstream_branch = get_upstream_tracking_branch(branch_name)
     default_branch = get_gitlab_default()
-    upstream = get_upstream_name()
+    upstream = get_upstream_details().get("remote", None)
+    if upstream is None:
+        raise TbDevException("Cannot determine the upstream remote")
 
     git_run(["fetch", upstream, default_branch])
 
     new_upstream_branch = f"{upstream}/{default_branch}"
     if current_upstream_branch == new_upstream_branch:
-        print(f"{branch_name} is already set to track the default branch {new_upstream_branch}.")
+        print(
+            f"{branch_name} is already set to track the default branch {new_upstream_branch}."
+        )
         return
 
     # We want to avoid checking out the old branch because this can cause
@@ -560,7 +629,7 @@ def show_diff_diff(args):
     """
     config_res = git_get(["config", "--get", "diff.tool"])
     if not config_res:
-        raise Exception("No diff.tool configured for git")
+        raise TbDevException("No diff.tool configured for git")
     diff_tool = config_res[0]
 
     # Filter out parts of the diff we expect to be different.
@@ -590,13 +659,13 @@ def show_diff_diff(args):
                 lines_match = lines_regex.match(line)
                 if lines_match:
                     # Fake data that will match.
-                    file.write("@@ ?,? ?,? @@" + lines_match.group('rest'))
+                    file.write("@@ ?,? ?,? @@" + lines_match.group("rest"))
                     continue
                 file.write(line)
 
         status = diff_process.poll()
         if status != 0:
-            raise Exception(f"git diff exited with status {status}")
+            raise TbDevException(f"git diff exited with status {status}")
 
         return file_name
 
@@ -614,7 +683,7 @@ def branch_complete(prefix, parsed_args, **kwargs):
     """
     Complete the argument with a branch name.
     """
-    if not within_tor_browser_root():
+    if not within_browser_root():
         return []
     try:
         branches = [ref.name for ref in get_refs("head", "")]
@@ -738,8 +807,11 @@ for name, details in {
 
 argcomplete.autocomplete(parser)
 
-if not within_tor_browser_root():
-    raise Exception("Must be within a tor-browser directory")
-parsed_args = parser.parse_args()
+try:
+    if not within_browser_root():
+        raise TbDevException("Must be within a browser directory")
+    parsed_args = parser.parse_args()
 
-parsed_args.func(parsed_args)
+    parsed_args.func(parsed_args)
+except TbDevException as err:
+    print(f"\x1b[1m{err}\x1b[0m", file=sys.stderr)



View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/38fb3e3eb270fc128b554e423517b92bf7c1cc1b

-- 
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/38fb3e3eb270fc128b554e423517b92bf7c1cc1b
You're receiving this email because of your account on gitlab.torproject.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tor-commits/attachments/20240930/698e5cef/attachment-0001.htm>


More information about the tor-commits mailing list