nodejs/node · error · Exception

%s is not a proper inspector_protocol checkout: %s

Error message

%s is not a proper inspector_protocol checkout: %s

What it means

roll.py verifies the upstream directory is genuinely a clone of the official inspector_protocol repo by checking `git config --get remote.origin.url`. Anything other than https://chromium.googlesource.com/deps/inspector_protocol.git is rejected, so files are never rolled from an unrelated tree.

Source

Thrown at tools/inspector_protocol/roll.py:54

  if p.returncode != 0:
    raise Exception('%s: exit status %d', str(cmd), p.returncode)
  return stdoutdata.decode('utf-8')


def CheckRepoIsClean(path):
  os.chdir(path)  # As a side effect this also checks for existence of the dir.
  # If path isn't a git repo, this will throw and exception.
  # And if it is a git repo and 'git status' has anything interesting to say,
  # then it's not clean (uncommitted files etc.)
  if len(RunCmd(['git', 'status', '--porcelain'])) != 0:
    raise Exception('%s is not a clean git repo (run git status)' % path)


def CheckRepoIsInspectorProtocolCheckout(path):
  os.chdir(path)
  revision = RunCmd(['git', 'config', '--get', 'remote.origin.url']).strip()
  if (revision != 'https://chromium.googlesource.com/deps/inspector_protocol.git'):
    raise Exception('%s is not a proper inspector_protocol checkout: %s' % (path, revision))


def FindFilesToSyncIn(path):
  files = []
  for f in FILES_TO_SYNC:
    files += glob.glob(os.path.join(path, f))
  files = [os.path.relpath(f, path) for f in files]
  return files


def FilesAreEqual(path1, path2):
  # We check for permissions (useful for executable scripts) and contents.
  return (os.stat(path1).st_mode == os.stat(path2).st_mode and
          open(path1).read() == open(path2).read())


def ReadV8IPRevision(node_src_path):
  lines = open(os.path.join(node_src_path, 'deps/v8/third_party/inspector_protocol/README.v8')).readlines()

View on GitHub (pinned to 1b2de5e052)

Solutions

  1. Clone the official repo: `git clone https://chromium.googlesource.com/deps/inspector_protocol.git ~/ip/src`.
  2. Repoint the existing checkout's origin: `git -C <upstream> remote set-url origin https://chromium.googlesource.com/deps/inspector_protocol.git`.
  3. Supply --ip_src_upstream pointing at that correct checkout.

Example fix

// before
python tools/inspector_protocol/roll.py --ip_src_upstream ~/my-fork
// after
git clone https://chromium.googlesource.com/deps/inspector_protocol.git ~/ip/src
python tools/inspector_protocol/roll.py --ip_src_upstream ~/ip/src
Defensive patterns

Strategy: validation

Validate before calling

import subprocess
OFFICIAL='https://chromium.googlesource.com/deps/inspector_protocol.git'
url=subprocess.run(['git','-C',ip_src,'config','--get','remote.origin.url'],
                   capture_output=True,text=True).stdout.strip()
assert url==OFFICIAL, f'origin is {url!r}'

Prevention

When it happens

Trigger: Passing --ip_src_upstream that points at a fork, a mirror, the node tree itself, or any repo whose origin URL differs from the official chromium URL.

Common situations: Using a personal fork for experimentation; cloning from a GitHub mirror; passing the wrong directory by mistake; the checkout's origin was rewritten.

Related errors


AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13). Data as JSON: /api/errors/3d4da0d7dd603930. Report an issue: GitHub.