{"id":20341995,"url":"https://github.com/briandfoy/app-bmt","last_synced_at":"2025-09-13T14:32:19.071Z","repository":{"id":66490398,"uuid":"336417344","full_name":"briandfoy/app-bmt","owner":"briandfoy","description":"brian's (Perl) module tool","archived":false,"fork":false,"pushed_at":"2025-09-09T17:13:27.000Z","size":161,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-09T20:54:38.975Z","etag":null,"topics":["perl","perl-module","perl-tool"],"latest_commit_sha":null,"homepage":"","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/briandfoy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-02-05T23:56:36.000Z","updated_at":"2025-09-09T17:13:31.000Z","dependencies_parsed_at":"2024-06-26T17:47:18.257Z","dependency_job_id":"655212a1-d88f-4c78-b9b9-40b448c783ea","html_url":"https://github.com/briandfoy/app-bmt","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/briandfoy/app-bmt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/briandfoy%2Fapp-bmt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/briandfoy%2Fapp-bmt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/briandfoy%2Fapp-bmt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/briandfoy%2Fapp-bmt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/briandfoy","download_url":"https://codeload.github.com/briandfoy/app-bmt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/briandfoy%2Fapp-bmt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274976892,"owners_count":25384285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-13T02:00:10.085Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["perl","perl-module","perl-tool"],"created_at":"2024-11-14T21:30:11.387Z","updated_at":"2025-09-13T14:32:19.056Z","avatar_url":"https://github.com/briandfoy.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bmt (brian's module tool)\n\nThis is my tool for managing my Perl modules and their repositories.\nIt's specifically designed for the way that I like to do things.\n\n* [Makefile.PL as a modulino](https://www.masteringperl.org/2015/01/makefile-pl-as-a-modulino/)\n* I store repos in GitHub, Bitbucket, and GitLab at the same time ([Use several Git Services at Once](https://briandfoy.github.io/use-several-git-services-at-once/))\n\nThings are likely broken because I'm not supporting this for other\npeople to use, so I tend to take less care than I would otherwise. And,\nthis uses a Perl module that is on GitHub but that I haven't released\nto CPAN, so good luck with that:\n\n\tuse lib qw(/Users/brian/Dev/ghojo/lib);\n\nBut, you can use this as a starting point for your own customized tool.\nSteal anything you like.\n\n# About the tool\n\nThere are all sorts of tasks I do inside a Perl module repository. Many\nof these tasks are informational, such as \"tell me if the local version\nof this module is higher than the version on CPAN\":\n\n\t% bmt versions\n\nThis task then knows how to talk to MetaCPAN and how to discover the\nlocal version.\n\nOther tasks make changes. For example, I have a set of general GitHub\nworkflows that I use across all of my modules. To update those from\ntheir repository ([briandfoy/github_workflows](https://github.com/briandfoy/github_workflows)) to the current repo:\n\n\t% bmt update_workflows\n\nThen various magic happens, including modifying the general workflows\nfor local requirements, such as randomizing the [`cron` triggers](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule).\n\nMost times I notice myself doing something often, I turn it into a command\nin this tool. This script grows by accretion.\n\nNot only that, but if I decide that I want some existing target to do\nsoemthing differently, I just change it. Indeed, one of the targets\nbrings up the script in my editor:\n\n\t% bmt edit\n\n# Some interesting ideas to steal\n\n## Do it the same way everywhere.\n\nI standardized the GitHub issues labels for all of my repos. And, using\nthe GitHub API, I can easily handle that:\n\n\t% bmt update_github_labels\n\nIf I add or change labels, I just run this again. Easy peasy.\n\n## Registering commands\n\nI have all of these commands, and I want to run the `help` command to\nsee what it can do:\n\n\t% bmt help\n\tactions                   open the actions Github page\n\tadjust_appveyor           adjust AppVeyor config for min Perl versions\n\tadjust_linux_workflow     adjust linux workflow perl versions\n\tall_remote                configure the all remote\n\tappveyor                  open the Appveyor page\n\tappveyor_page             open the Appveyor page\n\t...\n\nInstead of tracking this out of band, things get into this list because\nthe subroutine adds itself to the list at compile time through an\nattribute:\n\n\tsub cpan_testers :Register(\"show Testers result for the latest version\") ( $release = undef ) {\n\n## Makefile.PL exposes its arguments\n\nRead more about this in [Makefile.PL as a modulino](https://www.masteringperl.org/2015/01/makefile-pl-as-a-modulino/).\n*Makefile.PL* is basically a Perl module's build file, and various steps\nneed some of the information from that file:\n\n    $ bmt arguments\n\t{\n\t  \"ABSTRACT_FROM\" =\u003e \"lib/App/bmt.pm\",\n\t  \"AUTHOR\" =\u003e \"brian d foy \u003cbriandfoy\\@pobox.com\u003e\",\n\t  \"BUILD_REQUIRES\" =\u003e {},\n\t  \"CONFIGURE_REQUIRES\" =\u003e {\n\t\t\"ExtUtils::MakeMaker\" =\u003e \"6.64\",\n\t\t\"File::Spec::Functions\" =\u003e 0\n\t  },\n\t...\n\t}\n\nGetting at these settings makes automation much easier.\n\n## Compose commands\n\nThere are sets of lower-level commands that I want to run.  I just compose\nthem into a single command:\n\n\tsub update_all :Register(\"update many things at once\") () {\n\t\tstate @actions = qw(\n\t\t\tupdate_releaserc\n\t\t\tupdate_release_token\n\t\t\tupdate_appveyor\n\t\t\tupdate_workflows\n\t\t\tupdate_github_labels\n\t\t\tcreate_cb\n\t\t\tall_remote\n\t\t\tupdate_copyright\n\t\t\t);\n\n\t\t_combine_actions( @actions );\n\n\t\t'Updated everything';\n\t\t}\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbriandfoy%2Fapp-bmt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbriandfoy%2Fapp-bmt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbriandfoy%2Fapp-bmt/lists"}