#1418: Link failures name the objects that block the link #1481

Open
TheSlowly wants to merge 1 commit from TheSlowly/Slipstream:link-blockers-1418 into main
Collaborator

Fixes #1418.

linkObjects() keeps its checks and order; when one fails, the notice now names the root objects that break it (no-mod, permanent, other owner with the owner named, other region, still loading), up to 10 then "and N more", with Deselect these / Select only these. Names come from the selection's existing properties (no new requests); the old notices remain the fallback. The notices are non-modal so one can stay open while looking around.

Not done: animated-object failures (only the Link button's enable check knows them, linkObjects never fails on them).

Tests: sllinkblockers_test.cpp (standalone g++), link_blockers_checks.py in indra/newview/tests.

Fixes #1418. linkObjects() keeps its checks and order; when one fails, the notice now names the root objects that break it (no-mod, permanent, other owner with the owner named, other region, still loading), up to 10 then "and N more", with Deselect these / Select only these. Names come from the selection's existing properties (no new requests); the old notices remain the fallback. The notices are non-modal so one can stay open while looking around. Not done: animated-object failures (only the Link button's enable check knows them, linkObjects never fails on them). Tests: `sllinkblockers_test.cpp` (standalone g++), `link_blockers_checks.py` in indra/newview/tests.
Linking a big selection that holds one no-mod prim failed with a generic
"you don't have modify permission on all the objects", leaving the user
to hunt for the culprit among dozens of prims. The same went for
permanent (pathfinding) roots, mixed owners, a second region and data
still downloading.

linkObjects() keeps its checks, their order and what they allow. When
one fails, one pass over the selection's root nodes collects what the
selection already knows (name, permissions, owner, region, position; no
requests), and the notice names the roots that break that rule: up to
10, then "and N more". Same-named roots get their position, roots whose
properties haven't arrived show "(loading) at <position>". The owner
notice compares against the majority owner (a tie keeps the agent's own
objects) and names each other owner by an inspect link that resolves
through the name cache; the region notice names the majority region.

The notices get "Deselect these" (removes each named object's link set
from the selection, if it is still selected) and "Select only these"
(replaces the selection with the named objects). Both look the objects
up again when pressed and skip any that died, so a notice left open
stays safe. The still-downloading case stays a tip, now listing the
objects it waits for. When nothing can be named, the old notices show
as before.

The rules live in sllinkblockers.{h,cpp} with no viewer types, tested
standalone; a source check covers the wiring.

Test-Plan:
    g++ -std=c++17 -Wall -Wextra -Werror -I indra/newview indra/newview/tests/sllinkblockers_test.cpp indra/newview/sllinkblockers.cpp -o /tmp/sllinkblockers_test && /tmp/sllinkblockers_test
    python3 indra/newview/tests/link_blockers_checks.py --source-root .
    clang-cl /Zs with the Windows build flags on llselectmgr.cpp and sllinkblockers.cpp
    In world: select 50 prims including 2 no-mod ones, Link: the notice names the 2; Deselect these, then Link works
    In world: Select only these after a failed link selects just the named objects
    In world: a selection with another owner's modifiable object names it and its owner
    In world: a selection across a region border names the objects in the other region
    In world: link right after selecting a large set: the tip lists the objects still loading
    In world: Build floater Link button, Build > Link and Ctrl+L show the same notice

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TheSlowly force-pushed link-blockers-1418 from e3974ea23c to c997044bb0 2026-11-07 23:41:44 +00:00 Compare
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u link-blockers-1418:TheSlowly-link-blockers-1418
git switch TheSlowly-link-blockers-1418
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sky_line/Slipstream!1481
No description provided.