1
1
#!/usr/bin/python
2
2
3
3
import click
4
- import git
4
+ import subprocess
5
5
6
6
from graphviz import Digraph
7
- from itertools import chain
7
+
8
+
9
+ def git (* args ):
10
+ return subprocess .check_output (
11
+ ('git' ,) + args
12
+ ).decode ()
8
13
9
14
10
15
@click .command ()
@@ -27,12 +32,11 @@ def main(output, render, view, format, flag_remote, flag_tags,
27
32
exclude_remote , exclude_tag , exclude_branch ):
28
33
29
34
def _shortref (ref ):
30
- return ref . hexsha [:shortref_len ]
35
+ return ref [:shortref_len ]
31
36
32
37
if (render or view ) and not output :
33
38
raise click .ClickException ('--render and --view require --output' )
34
39
35
- repo = git .Repo ()
36
40
seen = set ()
37
41
38
42
graph = Digraph (name = 'git' , format = 'svg' ,
@@ -53,15 +57,18 @@ def main(output, render, view, format, flag_remote, flag_tags,
53
57
commit_links = set ()
54
58
tag_links = set ()
55
59
56
- for head in repo .heads :
57
- if head .name in exclude_branch :
60
+ for info in git ('for-each-ref' ,
61
+ '--format=%(objectname) %(refname:short)' ,
62
+ 'refs/heads/' ).splitlines ():
63
+ headid , head = info .split ()
64
+ if head in exclude_branch :
58
65
continue
59
66
60
- heads .node (head . name )
61
- branch_links .add ((head . name , _shortref (head . commit )))
67
+ heads .node (head )
68
+ branch_links .add ((head , _shortref (headid )))
62
69
63
70
if gather == 'branch' :
64
- sub = Digraph (node_attr = dict (group = f'{ head . name } _commits' ))
71
+ sub = Digraph (node_attr = dict (group = f'{ head } _commits' ))
65
72
commits .append (sub )
66
73
elif not commits and gather == 'commit' :
67
74
sub = Digraph (node_attr = dict (group = 'commits' ))
@@ -72,19 +79,22 @@ def main(output, render, view, format, flag_remote, flag_tags,
72
79
else :
73
80
sub = commits [0 ]
74
81
75
- for commit in chain ([ head . commit ] , head . commit . traverse () ):
82
+ for commit in git ( 'rev-list' , head ). splitlines ( ):
76
83
if commit in seen :
77
84
continue
78
85
seen .add (commit )
79
86
87
+ commit_summary = git ('show' , '--quiet' , '--format=%s' , commit ).splitlines ()[0 ]
88
+
80
89
if use_message :
81
- args = dict (tooltip = commit . hexsha , label = commit . summary )
90
+ args = dict (tooltip = commit , label = commit_summary )
82
91
else :
83
- args = dict (tooltip = commit . summary )
92
+ args = dict (tooltip = commit_summary )
84
93
85
94
sub .node (_shortref (commit ), ** args )
86
95
87
- for parent in commit .parents :
96
+ commit_parents = git ('rev-list' , '--parents' , '-n1' , commit ).split ()[1 :]
97
+ for parent in commit_parents :
88
98
commit_links .add ((_shortref (commit ), _shortref (parent )))
89
99
90
100
if gather != 'free' :
@@ -100,13 +110,16 @@ def main(output, render, view, format, flag_remote, flag_tags,
100
110
fontcolor = 'white' ,
101
111
))
102
112
103
- for remote in repo . remotes :
104
- if remote . name in exclude_remote :
113
+ for remote in git ( 'remote' ). splitlines () :
114
+ if remote in exclude_remote :
105
115
continue
106
116
107
- for ref in remote .refs :
108
- remote_heads .node (ref .name )
109
- branch_links .add ((ref .name , _shortref (ref .commit )))
117
+ for info in git ('for-each-ref' ,
118
+ '--format=%(objectname) %(refname:short)' ,
119
+ f'refs/remotes/{ remote } /' ).splitlines ():
120
+ refid , ref = info .split ()
121
+ remote_heads .node (ref )
122
+ branch_links .add ((ref , _shortref (refid )))
110
123
graph .subgraph (remote_heads )
111
124
112
125
if flag_tags :
@@ -116,12 +129,15 @@ def main(output, render, view, format, flag_remote, flag_tags,
116
129
fontcolor = 'black' ,
117
130
))
118
131
119
- for tag in repo .tags :
120
- if tag .name in exclude_tag :
132
+ for info in git ('for-each-ref' ,
133
+ '--format=%(objectname) %(refname:short)' ,
134
+ 'refs/tags/' ).splitlines ():
135
+ tagid , tag = info .split ()
136
+ if tag in exclude_tag :
121
137
continue
122
138
123
- tags .node (tag . name )
124
- tag_links .add ((tag . name , _shortref (tag . commit )))
139
+ tags .node (tag )
140
+ tag_links .add ((tag , _shortref (tagid )))
125
141
graph .subgraph (tags )
126
142
127
143
if branch_links :
0 commit comments