• 
      

    Add repositories directly into the connected services list.

    Review Request #15201 — Created July 28, 2026 and submitted

    Information

    Review Board
    release-9.x

    Reviewers

    This change adds a disclosure at the bottom of entries in the connected
    services list page to show repositories for each service. When opened,
    this provides the list of all connected repositories. This list shows
    the repository name, the path (optionally munge-able by the hosting
    service so we can show things like "org/repo" for GitHub), and an
    indicator for when repositories have access controls.

    If there are fewer than 25 repositories in a given list, this just shows
    them all. When there are more than that, several additional controls are
    available. Above the list is a search bar (which searches both names and
    paths), and when there are multiple connected accounts within the
    service, a drop-down to filter by account. Below the list is a
    paginator.

    • Ran unit tests.
    • Tested both the small and large cases. Verified that search and
      filtering worked as expected.
    Summary ID
    Add repositories directly into the connected services list.
    This change adds a disclosure at the bottom of entries in the connected services list page to show repositories for each service. When opened, this provides the list of all connected repositories. This list shows the repository name, the path (optionally munge-able by the hosting service so we can show things like "org/repo" for GitHub), and an indicator for when repositories have access controls. If there are fewer than 25 repositories in a given list, this just shows them all. When there are more than that, several additional controls are available. Above the list is a search bar (which searches both names and paths), and when there are multiple connected accounts within the service, a drop-down to filter by account. Below the list is a paginator. One thing that I had to change as part of this: `buttons.less` was applying button styles to any `<button>` element that wasn't explicitly carrying the `.ink-c-button` class. This overrode styles from the paginator component, and also made it difficult to style the disclosure item. I've narrowed this to apply that style to any button that doesn't explicitly have its own component class. Testing Done: - Ran unit tests. - Tested both the small and large cases. Verified that search and filtering worked as expected.
    mrlxyxunsxqxxqymtypkosxxyvyosmzt

    Description From Last Updated

    What's going on with the double line here, can we make it so that there's only one line.

    maubin maubin

    I feel like "Limited access" is kind of ambiguous here, almost like this could mean Review Board has limited access …

    maubin maubin

    I think we could use _get_repository_owner_raw() and _get_repository_name_raw() here instead of parsing.

    maubin maubin

    This can be one statement: return HttpResponse( html, headers={ 'X-Num-Pages': ..., 'X-Page-Number': ..., 'X-Total-Count': ..., }, )

    chipx86 chipx86

    Can you keep the alphabetical order?

    chipx86 chipx86

    Here, too.

    chipx86 chipx86

    Missing a "Version Added">

    chipx86 chipx86

    We should stick with "Personal Access Tokens" here, especially since we then abbreviate it.

    chipx86 chipx86

    All other CSS components are documented with the structure at a part-by-part level. This one isn't doing that, and should …

    chipx86 chipx86

    These parts are missing docs. I know the top-level one is showing the overall structure, but component structure docs are …

    chipx86 chipx86

    These should be placed alphabetically (it's nested between two cs).

    chipx86 chipx86

    This section's ordering is all over the place. Can we aim for alphabetical?

    chipx86 chipx86

    Here and others like it are missing parens.

    chipx86 chipx86

    We are accessing this.#expanded in every statement. Can we pull out the new value first?

    chipx86 chipx86

    We perform this check twice. Can we pull out the result into a variable once and then check that?

    chipx86 chipx86

    This check is done in four places that I noticed. Is this something we can compute once up above and …

    chipx86 chipx86

    This should be in our standard multi-line format.

    chipx86 chipx86

    This is missing parens around the comparison.

    chipx86 chipx86

    'typing.cast' imported but unused Column: 1 Error code: F401

    reviewbot reviewbot
    david
    maubin
    1. 
        
    2. Show all issues

      What's going on with the double line here, can we make it so that there's only one line.

      1. This is because the list is scrolled somewhat.

    3. Show all issues

      I feel like "Limited access" is kind of ambiguous here, almost like this could mean Review Board has limited access to this repository or something. We say "Private repository" in our docs, how about using "Private" here too?

    4. reviewboard/hostingsvcs/github/service.py (Diff revision 2)
       
       
       
       
       
       
      Show all issues

      I think we could use _get_repository_owner_raw() and _get_repository_name_raw() here instead of parsing.

      1. Hmm. So one nit here is that we have the repository object but I don't really want to instantiate the hosting service class itself for every repository just to get this out. I kind of hate the way that those methods work too.

        Let me think about how I want to rework all this.

      2. I'm going to fix these things up in a separate change.

    5. 
        
    david
    maubin
    1. Ship It!
    2. 
        
    chipx86
    1. 
        
    2. reviewboard/admin/views.py (Diff revision 3)
       
       
       
       
       
       
       
       
      Show all issues

      This can be one statement:

      return HttpResponse(
          html,
          headers={
              'X-Num-Pages': ...,
              'X-Page-Number': ...,
              'X-Total-Count': ...,
          },
      )
      
    3. reviewboard/hostingsvcs/base/hosting_service.py (Diff revision 3)
       
       
       
       
       
       
      Show all issues

      Can you keep the alphabetical order?

    4. reviewboard/hostingsvcs/base/hosting_service.py (Diff revision 3)
       
       
       
       
       
       
       
       
      Show all issues

      Here, too.

    5. reviewboard/hostingsvcs/github/service.py (Diff revision 3)
       
       
       
       
       
      Show all issues

      Missing a "Version Added">

      1. This goes away in a later change (repo owner/name cleanup requested by Michelle)

    6. reviewboard/hostingsvcs/github/service.py (Diff revision 3)
       
       
       
       
       
      Show all issues

      We should stick with "Personal Access Tokens" here, especially since we then abbreviate it.

    7. reviewboard/static/rb/css/pages/admin/connected-services.less (Diff revision 3)
       
       
       
       
       
       
       
       
       
       
       
       
       
       
      Show all issues

      All other CSS components are documented with the structure at a part-by-part level. This one isn't doing that, and should be updated for this. That style's important because we often have attributes (e.g., ARIA, roles, tabindexes) that must be specified per-part, and parts can sometimes be used within multiple other parts.

      I don't want to get to a point where different components are documented in different ways. The approach used in Ink is the right one to follow.

    8. reviewboard/static/rb/css/pages/admin/connected-services.less (Diff revision 3)
       
       
       
       
       
       
       
       
      Show all issues

      These parts are missing docs.

      I know the top-level one is showing the overall structure, but component structure docs are always part-by-part. That style's important because we often have attributes (e.g., ARIA, roles, tabindexes) that must be specified per-part, and parts can sometimes be used within multiple other parts.

      I want to make sure we don't start to diverge too much as we write new ones, both for ourselves and for agents. When in doubt, use the components in Ink as a reference.

      This all applies throughout the file.

    9. reviewboard/static/rb/js/admin/views/connectedServicesView.ts (Diff revision 3)
       
       
       
       
       
       
       
       
       
       
       
       
       
      Show all issues

      These should be placed alphabetically (it's nested between two cs).

    10. Show all issues

      This section's ordering is all over the place. Can we aim for alphabetical?

    11. Show all issues

      Here and others like it are missing parens.

    12. Show all issues

      We are accessing this.#expanded in every statement. Can we pull out the new value first?

    13. Show all issues

      We perform this check twice. Can we pull out the result into a variable once and then check that?

    14. Show all issues

      This check is done in four places that I noticed. Is this something we can compute once up above and then reuse?

      A descriptive name and maybe would also help make this code a bit more clear, because it's not entirely clear to me how we get into this condition.

      1. We can't compute once, because this is guarding against multiple typeahead request results coming back, potentially even out-of-order because TCP. The doc for #requestSeq explains what that is and what it's doing but I'll add another comment where we define seq here.

    15. Show all issues

      This should be in our standard multi-line format.

    16. Show all issues

      This is missing parens around the comparison.

    17. 
        
    david
    Review request changed
    Commits:
    Summary ID
    Add repositories directly into the connected services list.
    This change adds a disclosure at the bottom of entries in the connected services list page to show repositories for each service. When opened, this provides the list of all connected repositories. This list shows the repository name, the path (optionally munge-able by the hosting service so we can show things like "org/repo" for GitHub), and an indicator for when repositories have access controls. If there are fewer than 25 repositories in a given list, this just shows them all. When there are more than that, several additional controls are available. Above the list is a search bar (which searches both names and paths), and when there are multiple connected accounts within the service, a drop-down to filter by account. Below the list is a paginator. One thing that I had to change as part of this: `buttons.less` was applying button styles to any `<button>` element that wasn't explicitly carrying the `.ink-c-button` class. This overrode styles from the paginator component, and also made it difficult to style the disclosure item. I've narrowed this to apply that style to any button that doesn't explicitly have its own component class. Testing Done: - Ran unit tests. - Tested both the small and large cases. Verified that search and filtering worked as expected.
    mrlxyxunsxqxxqymtypkosxxyvyosmzt
    Add repositories directly into the connected services list.
    This change adds a disclosure at the bottom of entries in the connected services list page to show repositories for each service. When opened, this provides the list of all connected repositories. This list shows the repository name, the path (optionally munge-able by the hosting service so we can show things like "org/repo" for GitHub), and an indicator for when repositories have access controls. If there are fewer than 25 repositories in a given list, this just shows them all. When there are more than that, several additional controls are available. Above the list is a search bar (which searches both names and paths), and when there are multiple connected accounts within the service, a drop-down to filter by account. Below the list is a paginator. One thing that I had to change as part of this: `buttons.less` was applying button styles to any `<button>` element that wasn't explicitly carrying the `.ink-c-button` class. This overrode styles from the paginator component, and also made it difficult to style the disclosure item. I've narrowed this to apply that style to any button that doesn't explicitly have its own component class. Testing Done: - Ran unit tests. - Tested both the small and large cases. Verified that search and filtering worked as expected.
    mrlxyxunsxqxxqymtypkosxxyvyosmzt

    Checks run (1 failed, 1 succeeded)

    flake8 failed.
    JSHint passed.

    flake8

    david
    chipx86
    1. Ship It!
    2. 
        
    david
    Review request changed
    Status:
    Completed
    Change Summary:
    Pushed to release-9.x (87321a8)