aboutsummaryrefslogtreecommitdiffstats
path: root/git_deps/cli.py
diff options
context:
space:
mode:
Diffstat (limited to 'git_deps/cli.py')
-rwxr-xr-xgit_deps/cli.py149
1 files changed, 149 insertions, 0 deletions
diff --git a/git_deps/cli.py b/git_deps/cli.py
new file mode 100755
index 0000000..3ffc451
--- /dev/null
+++ b/git_deps/cli.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+git-deps - automatically detect dependencies between git commits
+Copyright (C) 2013 Adam Spiers <git@adamspiers.org>
+
+The software in this repository is free software: you can redistribute
+it and/or modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation, either version 2 of the
+License, or (at your option) any later version.
+
+This software is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from __future__ import print_function
+
+import argparse
+import json
+import sys
+
+from git_deps import __version__
+from git_deps.detector import DependencyDetector
+from git_deps.errors import InvalidCommitish
+from git_deps.gitutils import GitUtils
+from git_deps.listener.json import JSONDependencyListener
+from git_deps.listener.cli import CLIDependencyListener
+from git_deps.server import serve
+from git_deps.utils import abort
+
+__author__ = "Adam Spiers"
+__copyright__ = "Adam Spiers"
+__license__ = "GPL-2+"
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(
+ description='Auto-detects commits on which the given '
+ 'commit(s) depend.',
+ usage='%(prog)s [options] COMMIT-ISH [COMMIT-ISH...]',
+ add_help=False
+ )
+ parser.add_argument('-h', '--help', action='help',
+ help='Show this help message and exit')
+ parser.add_argument('-v', '--version', action='version',
+ version='git-deps {ver}'.format(ver=__version__))
+ parser.add_argument('-l', '--log', dest='log', action='store_true',
+ help='Show commit logs for calculated dependencies')
+ parser.add_argument('-j', '--json', dest='json', action='store_true',
+ help='Output dependencies as JSON')
+ parser.add_argument('-s', '--serve', dest='serve', action='store_true',
+ help='Run a web server for visualizing the '
+ 'dependency graph')
+ parser.add_argument('-b', '--bind-ip', dest='bindaddr', type=str,
+ metavar='IP', default='127.0.0.1',
+ help='IP address for webserver to '
+ 'bind to [%(default)s]')
+ parser.add_argument('-p', '--port', dest='port', type=int, metavar='PORT',
+ default=5000,
+ help='Port number for webserver [%(default)s]')
+ parser.add_argument('-r', '--recurse', dest='recurse', action='store_true',
+ help='Follow dependencies recursively')
+ parser.add_argument('-e', '--exclude-commits', dest='exclude_commits',
+ action='append', metavar='COMMITISH',
+ help='Exclude commits which are ancestors of the '
+ 'given COMMITISH (can be repeated)')
+ parser.add_argument('-c', '--context-lines', dest='context_lines',
+ type=int, metavar='NUM', default=1,
+ help='Number of lines of diff context to use '
+ '[%(default)s]')
+ parser.add_argument('-d', '--debug', dest='debug', action='store_true',
+ help='Show debugging')
+
+ options, args = parser.parse_known_args()
+
+ # Are we potentially detecting dependencies for more than one commit?
+ # Even if we're not recursing, the user could specify multiple commits
+ # via CLI arguments.
+ options.multi = options.recurse
+
+ if options.serve:
+ if options.log:
+ parser.error('--log does not make sense in webserver mode.')
+ if options.json:
+ parser.error('--json does not make sense in webserver mode.')
+ if options.recurse:
+ parser.error('--recurse does not make sense in webserver mode.')
+ if len(args) > 0:
+ parser.error('Specifying commit-ishs does not make sense in '
+ 'webserver mode.')
+ else:
+ if len(args) == 0:
+ parser.error('You must specify at least one commit-ish.')
+
+ return options, args
+
+
+def cli(options, args):
+ detector = DependencyDetector(options)
+
+ if options.json:
+ listener = JSONDependencyListener(options)
+ else:
+ listener = CLIDependencyListener(options)
+
+ detector.add_listener(listener)
+
+ if len(args) > 1:
+ options.multi = True
+
+ for revspec in args:
+ revs = GitUtils.rev_list(revspec)
+ if len(revs) > 1:
+ options.multi = True
+
+ for rev in revs:
+ try:
+ detector.find_dependencies(rev)
+ except KeyboardInterrupt:
+ pass
+
+ if options.json:
+ print(json.dumps(listener.json(), sort_keys=True, indent=4))
+
+
+def main(args):
+ options, args = parse_args()
+ # rev_list = sys.stdin.readlines()
+
+ if options.serve:
+ serve(options)
+ else:
+ try:
+ cli(options, args)
+ except InvalidCommitish as e:
+ abort(e.message())
+
+
+def run():
+ main(sys.argv[1:])
+
+
+if __name__ == "__main__":
+ run()