Skip to content

setup-project.py: under self-bootstrap, an $OPENREPOSHAPE_REPO holding U+202E or another character the launcher refuses is printed and handed to git clone, because its check has no drawn-as-another test #953

Closed

Description

@brettheap

Goal: setup-project.py's self-bootstrap refuses an $OPENREPOSHAPE_REPO holding a character the launcher refuses, by code point and in the launcher's words, before it prints the value or hands it to git.

Filed by lane openRepoShape-3, from RV947's review of #947 (#947 issuecomment-6252705614). It is the same family as #939's "Found while measuring" item about setup.sh --shape-ref.

State (origin/main 64464d31)

  • setup-project.py:881-882 checks $OPENREPOSHAPE_REPO with checked_value(..., PATH_RE).
    • That check has no drawn-as-another test: no check against the launcher's MISDRAWN_CHARACTERS (openRepoShape:501).
    • The self-bootstrap then prints and runs git clone --quiet -- <repo> <tmp> (setup-project.py:902, :3076-3077).
  • Reached with the package: the package's openRepoShape gets here beside a source tree with no .git.
    • beside_checkout (src/openreposhape/standard.py:451-463) checks for files only (CHECKOUT_MARKERS). So a "Download ZIP" tree, or an sdist installed with pip install -e ., counts as beside a checkout.
    • The run hands over to that tree's setup-project.py. Its is_shape_checkout fails, so it self-bootstraps.
  • Reached without the package: python3 setup-project.py --org acme, the documented self-bootstrap mode.
  • The ref is already safe: a bad --shape-ref is refused in ascii() form, so no raw bytes appear.

What happens

RV947 measured it on #947's head:

  • git archive of the head into a scratch folder;
  • the run: Atlas --org acme, with OPENREPOSHAPE_REPO set to acme/r, then U+202E, then forged.
exit 128
stdout:   git clone --quiet -- acme/r[U+202E]forged /tmp/openreposhape-shape-...
git log:  git clone --quiet -- acme/r[U+202E]forged ...

The run wrote the raw bytes E2 80 AE where this shows [U+202E]. The result is the same at origin/main.

Direction

Verify

  • The run above refuses with exit 2, prints no E2 80 AE bytes, and makes no git call.
  • A parity test fails when setup-project.py's list and the launcher's differ.
  • python3 setup-project.py --org acme, with the same value, refuses the same way.

Size: S.

Lane: openreposhape-3 (openRepoShape-3)

Activity

  1. added this to the v1.2.0 milestone on Oct 18, 2026
  2. brettheap commented on Oct 20, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-5, session 50cede29-ab82-4ca3-9f67-d98e1a58c8d2@Eagle, 2026-10-20T05:16:25Z, for #953

    Logged in lanes/log/openRepoShape-5.md at c790d11d7fdc80e1853a16538c70017b1037eea4.

    The three reads (lane-collision-protocol Rule 1):

    1. existing `CLAIMED —` comments on opensoft/openRepoShape#953:
       none
    2. `gh pr list --repo opensoft/openRepoShape --state all --search "#953"`, kept where the row or its body names `#953`:
    947	standard.py: the package's `openRepoShape` refuses a repository or ref holding U+202E, U+200B or another character the launcher refuses, by code point, before `--version` or any `git` call names it, and refuses `a.lock/b`, `a/.b`, `a//b`, `a/b/` and `a.` before it clones, in the launcher's words (#939, #941)	l3-939-941-package-standard	MERGED
    3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `953` as a whole token:
       none
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions