NAME
    Git::Grouper - Categorize git repositories into one/more groups and
    perform actions on them

VERSION
    This document describes version 0.006 of Git::Grouper (from Perl
    distribution Git-Grouper), released on 2025-11-13.

SYNOPSIS
    See the included script git-grouper.

DESCRIPTION
FUNCTIONS
  configure_repo
    Usage:

     configure_repo(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Configure repo based on group's attributes.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   clean_remotes => *bool*

        Delete all remotes not specified by the group configuration.

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  filter_repo_has_group
    Usage:

     filter_repo_has_group(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Only list repos that belong to specified group(s).

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   group_spec => *str*

        (No description)

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  filter_repo_lacks_group
    Usage:

     filter_repo_lacks_group(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Only list repos that do not belong to specified group(s).

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   group_spec => *str*

        (No description)

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  filter_repo_multiple_group
    Usage:

     filter_repo_multiple_group(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Only list repos that belong to at least two groups.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  filter_repo_not_orphan
    Usage:

     filter_repo_not_orphan(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Only list repos that belong to at least one group.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  filter_repo_orphan
    Usage:

     filter_repo_orphan(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Only list repos that do not belong to any group(s).

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  filter_repo_single_group
    Usage:

     filter_repo_single_group(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Only list repos that belong to just a single group.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  ls_all_groups
    Usage:

     ls_all_groups(%args) -> [$status_code, $reason, $payload, \%result_meta]

    List all defined groups.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   detail => *bool*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  ls_all_remotes
    Usage:

     ls_all_remotes(%args) -> [$status_code, $reason, $payload, \%result_meta]

    List all defined remotes.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   detail => *bool*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  ls_repo_groups
    Usage:

     ls_repo_groups(%args) -> [$status_code, $reason, $payload, \%result_meta]

    List the group(s) of specified repos.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   config => *hash*

        (No description)

    *   config_file => *filename*

        (No description)

    *   groups_array => *str* (default: "never")

        How to return groups.

        When set to 'never', will always return a string where multiple
        groups are written as comma-separated list ('', 'group1',
        'group1,group2'). When set to 'auto', will return either an empty
        string when there is no group, or string for a single group, or
        array for multiple groups. When set to 'always', will always return
        an array for the groups result.

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    *   result_array => *str* (default: "auto")

        How to return result.

        If set to 'auto', then when there is only one repo, will not return
        an array but the groups directly. When set to 'always', will always
        return an array of records.

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  ls_repo_remotes
    Usage:

     ls_repo_remotes(%args) -> [$status_code, $reason, $payload, \%result_meta]

    List remotes of specified repos based on group configuration.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   ignore_nondirs => *bool*

        (No description)

    *   repo => *array[str]*

        (No description)

    *   result_array => *str*

        (No description)

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

HOMEPAGE
    Please visit the project's homepage at
    <https://metacpan.org/release/Git-Grouper>.

SOURCE
    Source repository is at <https://github.com/perlancar/perl-Git-Grouper>.

AUTHOR
    perlancar <perlancar@cpan.org>

CONTRIBUTING
    To contribute, you can send patches by email/via RT, or send pull
    requests on GitHub.

    Most of the time, you don't need to build the distribution yourself. You
    can simply modify the code, then test via:

     % prove -l

    If you want to build the distribution (e.g. to try to install it locally
    on your system), you can install Dist::Zilla,
    Dist::Zilla::PluginBundle::Author::PERLANCAR,
    Pod::Weaver::PluginBundle::Author::PERLANCAR, and sometimes one or two
    other Dist::Zilla- and/or Pod::Weaver plugins. Any additional steps
    required beyond that are considered a bug and can be reported to me.

COPYRIGHT AND LICENSE
    This software is copyright (c) 2025 by perlancar <perlancar@cpan.org>.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

BUGS
    Please report any bugs or feature requests on the bugtracker website
    <https://rt.cpan.org/Public/Dist/Display.html?Name=Git-Grouper>

    When submitting a bug or request, please include a test-file or a patch
    to an existing test-file that illustrates the bug or desired feature.

