* [PATCH b4] prep: add --cleanup-older-than option to clean up stale branches
@ 2026-03-23 11:58 Breno Leitao
0 siblings, 0 replies; only message in thread
From: Breno Leitao @ 2026-03-23 11:58 UTC (permalink / raw)
To: Kernel.org Tools; +Cc: Konstantin Ryabitsev, kernel-team, Breno Leitao
B4 is so useful that I have too many branches now, create a way to
easily remove old branches.
Add a new --cleanup-older-than DAYS option that archives and removes
prep-tracked branches whose latest commit is older than the specified
number of days. Each matching branch goes through the normal per-branch
confirmation prompt.
Signed-off-by: Breno Leitao <leitao@debian.org>
---
src/b4/command.py | 2 ++
src/b4/ez.py | 44 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 46 insertions(+)
diff --git a/src/b4/command.py b/src/b4/command.py
index ca7f238..2d263de 100644
--- a/src/b4/command.py
+++ b/src/b4/command.py
@@ -401,6 +401,8 @@ def setup_parser() -> argparse.ArgumentParser:
help='Show series info in a format that can be passed to other commands.')
spp_g.add_argument('--cleanup', metavar='BRANCHNAME', nargs='*',
help='Archive and remove prep-tracked branches and all associated sent/ tags')
+ sp_prep.add_argument('--cleanup-older-than', metavar='DAYS', type=int, default=None,
+ help='Archive prep-tracked branches older than DAYS days')
ag_prepn = sp_prep.add_argument_group('Create new branch', 'Create a new branch for working on patch series')
ag_prepn.add_argument('-n', '--new', dest='new_series_name',
diff --git a/src/b4/ez.py b/src/b4/ez.py
index b7afab5..70b9f97 100644
--- a/src/b4/ez.py
+++ b/src/b4/ez.py
@@ -2681,6 +2681,47 @@ def _cleanup_branch(branch: str) -> None:
logger.info('Wrote: %s', tarpath)
+def _get_branch_latest_commit_age_days(branch: str) -> Optional[int]:
+ """Return the age in days of the latest commit on *branch*, or None on error."""
+ lines = b4.git_get_command_lines(None, ['log', '-1', '--format=%ct', branch])
+ if not lines:
+ return None
+ try:
+ commit_ts = int(lines[0])
+ except ValueError:
+ return None
+ age_days = (time.time() - commit_ts) / 86400
+ return int(age_days)
+
+
+def cleanup_older_than(older_than_days: int) -> None:
+ """Find prep-tracked branches whose latest commit exceeds *older_than_days* and clean them up.
+
+ The currently checked-out branch is always skipped. Each matching
+ branch is passed to ``_cleanup_branch``, which prompts the user for
+ confirmation before archiving and deleting it.
+ """
+ mybranches = get_prep_managed_branches(None)
+ if not mybranches:
+ logger.info('No b4-tracked branches found')
+ sys.exit(0)
+
+ curbranch = b4.git_get_current_branch()
+ old_branches = []
+ for branch in mybranches:
+ if branch == curbranch:
+ logger.debug('Skipping currently checked out branch: %s', branch)
+ continue
+ age = _get_branch_latest_commit_age_days(branch)
+ if age is not None and age > older_than_days:
+ old_branches.append(branch)
+ if not old_branches:
+ logger.info('No branches older than %d days found', older_than_days)
+ return
+ for branch in old_branches:
+ _cleanup_branch(branch)
+
+
def cleanup(branches: List[str]) -> None:
if not branches:
# Show all b4-tracked branches
@@ -3089,6 +3130,9 @@ def cmd_prep(cmdargs: argparse.Namespace) -> None:
if cmdargs.show_info:
return show_info(cmdargs.show_info)
+ if cmdargs.cleanup_older_than is not None:
+ return cleanup_older_than(cmdargs.cleanup_older_than)
+
if cmdargs.cleanup is not None:
return cleanup(cmdargs.cleanup)
---
base-commit: bc4c73c5333d7d88428e4ce970facd48d6b8b107
change-id: 20260323-cleanup-4dea45140971
Best regards,
--
Breno Leitao <leitao@debian.org>
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-03-23 12:01 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-23 11:58 [PATCH b4] prep: add --cleanup-older-than option to clean up stale branches Breno Leitao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox