| Index: git_utils/git-tree-prune
|
| diff --git a/git_utils/git-tree-prune b/git_utils/git-tree-prune
|
| deleted file mode 100755
|
| index 556183d8753e5e01aed21feea57b85922272d094..0000000000000000000000000000000000000000
|
| --- a/git_utils/git-tree-prune
|
| +++ /dev/null
|
| @@ -1,122 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""Lists branches with closed and abandoned issues."""
|
| -
|
| -import optparse
|
| -import os
|
| -import sys
|
| -import urllib2
|
| -
|
| -BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
| -DEPOT_TOOLS_DIR = os.path.dirname(BASE_DIR)
|
| -sys.path.insert(0, DEPOT_TOOLS_DIR)
|
| -
|
| -import git_cl
|
| -
|
| -
|
| -def get_branches():
|
| - """Get list of all local git branches."""
|
| - branches = [l.split() for l in git_cl.RunGit(
|
| - ["for-each-ref",
|
| - "--format=%(refname:short) %(upstream:short)",
|
| - "refs/heads"]).splitlines()]
|
| - return [Branch(*b) for b in branches]
|
| -
|
| -def get_change_count(start, end):
|
| - return int(git_cl.RunGit(["rev-list", "%s..%s" % (start, end), "--count" ]))
|
| -
|
| -
|
| -class Branch(git_cl.Changelist):
|
| - def __init__(self, name, upstream=None):
|
| - git_cl.Changelist.__init__(self, branchref=name)
|
| - self._upstream = upstream
|
| - self._distance = None
|
| - self._issue_status = None
|
| -
|
| - def GetStatus(self):
|
| - if not self._issue_status:
|
| - if self.GetIssue():
|
| - try:
|
| - issue_properties = self.RpcServer().get_issue_properties(
|
| - self.GetIssue(), None)
|
| - if issue_properties['closed']:
|
| - self._issue_status = 'closed'
|
| - else:
|
| - self._issue_status = 'pending'
|
| - except urllib2.HTTPError, e:
|
| - if e.code == 404:
|
| - self._issue_status = 'abandoned'
|
| - else:
|
| - self._issue_status = 'no-issue'
|
| - if (self._issue_status != 'pending'
|
| - and self._upstream
|
| - and not self.GetDistance()[0]
|
| - and not self._upstream.startswith("origin/")):
|
| - self._issue_status = 'empty'
|
| - return self._issue_status
|
| -
|
| - def GetDistance(self):
|
| - if self._upstream is None:
|
| - return None;
|
| - if not self._distance:
|
| - self._distance = [get_change_count(self._upstream, self.GetBranch()),
|
| - get_change_count(self.GetBranch(), self._upstream)]
|
| - return self._distance
|
| -
|
| - def GetDistanceInfo(self):
|
| - if not self._upstream:
|
| - return "<No upstream branch>"
|
| - formatted_dist = ", ".join(["%s %d" % (x,y)
|
| - for (x,y) in zip(["ahead","behind"], self.GetDistance()) if y])
|
| - return "[%s%s]" % (
|
| - self._upstream, ": " + formatted_dist if formatted_dist else "")
|
| -
|
| -def print_branches(title, fmt, branches):
|
| - if branches:
|
| - print title
|
| - for branch in branches:
|
| - print fmt.format(branch=branch.GetBranch(),
|
| - issue=branch.GetIssue(),
|
| - distance=branch.GetDistanceInfo())
|
| -
|
| -def main():
|
| - parser = optparse.OptionParser(usage=sys.modules['__main__'].__doc__)
|
| - options, args = parser.parse_args()
|
| - if args:
|
| - parser.error('Unsupported arg: %s' % args)
|
| -
|
| - branches = get_branches()
|
| - filtered = { 'closed' : [],
|
| - 'empty' : [],
|
| - 'pending' : [],
|
| - 'abandoned' : [],
|
| - 'no-issue' : []}
|
| -
|
| - for branch in branches:
|
| - filtered[branch.GetStatus()].append(branch)
|
| -
|
| - print_branches("# Branches with closed issues",
|
| - "git branch -D {branch} # Issue {issue} is closed.",
|
| - filtered['closed'])
|
| - print_branches("\n# Empty branches",
|
| - "git branch -D {branch} # Empty.",
|
| - filtered['empty'])
|
| - print_branches("\n# Pending Branches",
|
| - "# Branch {branch} - Issue {issue} - {distance}",
|
| - filtered['pending']);
|
| - print_branches("\n# Branches with abandoned issues",
|
| - "# Branch {branch} - was issue {issue} - {distance}",
|
| - filtered['abandoned'])
|
| -
|
| - print_branches("\n# Branches without associated issues",
|
| - "# Branch {branch} - {distance}",
|
| - filtered['no-issue'])
|
| -
|
| - return 0
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - sys.exit(main())
|
|
|