diff --git a/git_redmine.py b/git_redmine.py index 41ff9c6..50cb794 100644 --- a/git_redmine.py +++ b/git_redmine.py @@ -555,5 +555,50 @@ def set(project_id): config_writer.write() +@redmine.command() +def clean(): + repo = get_repo() + repo.git.fetch(prune=True) + api = get_redmine_api() + issue_re = re.compile(r'wip/([0-9]+)') + issues_to_branch = {} + + origin = repo.remote() + for ref in origin.refs: + m = issue_re.search(ref.name) + if not m: + continue + issues_to_branch[m.group(1)] = ref.name.lstrip('origin/') + if not issues_to_branch: + return + issues = api.issue.filter(issue_id=','.join(issues_to_branch), status_id='closed') + issues_to_delete = list(issues.values_list('id', 'subject')) + for _id, _subject in issues_to_delete: + print('%5s | %60s | %s' % (_id, issues_to_branch[str(_id)][:60], _subject)) + if issues_to_delete and click.confirm('Remove theses remote branches ?'): + for _id, _subject in issues_to_delete: + ref = issues_to_branch[str(_id)] + click.echo('Deleting origin/%s... ' % ref, nl=False) + origin.push(refspec=':%s' % ref) + click.echo(click.style('Done.', fg='green')) + + issues_to_branch = {} + for ref in repo.branches: + m = issue_re.search(ref.name) + if not m: + continue + issues_to_branch[m.group(1)] = ref.name + issues = api.issue.filter(issue_id=','.join(issues_to_branch), status_id='closed') + issues_to_delete = list(issues.values_list('id', 'subject')) + for _id, _subject in issues_to_delete: + print('%5s | %60s | %s' % (_id, issues_to_branch[str(_id)][:60], _subject)) + if issues_to_delete and click.confirm('Remove theses branches ?'): + for _id, _subject in issues_to_delete: + ref = issues_to_branch[str(_id)] + click.echo('Deleting %s... ' % ref, nl=False) + repo.delete_head(ref, force=True) + click.echo(click.style('Done.', fg='green')) + + if __name__ == '__main__': redmine()