@@ -8,7 +8,7 @@ extern crate clap;
8
8
9
9
use colored:: Color ;
10
10
use colored:: * ;
11
- use git2:: Repository ;
11
+ use git2:: { Repository , Oid } ;
12
12
use license:: License ;
13
13
use clap:: { App , Arg } ;
14
14
use std:: {
@@ -28,6 +28,7 @@ type Result<T> = result::Result<T, Error>;
28
28
29
29
struct Info {
30
30
project_name : String ,
31
+ current_commit : CommitInfo ,
31
32
version : String ,
32
33
dominant_language : Language ,
33
34
languages : Vec < ( Language , f64 ) > ,
@@ -54,6 +55,13 @@ impl fmt::Display for Info {
54
55
self . project_name
55
56
) ?;
56
57
58
+ writeln ! (
59
+ buffer,
60
+ "{}{}" ,
61
+ "HEAD: " . color( color) . bold( ) ,
62
+ self . current_commit
63
+ ) ?;
64
+
57
65
writeln ! (
58
66
buffer,
59
67
"{}{}" ,
@@ -220,6 +228,30 @@ fn true_len(line: &str) -> usize {
220
228
. len ( )
221
229
}
222
230
231
+ struct CommitInfo {
232
+ commit : Oid ,
233
+ refs : Vec < String > ,
234
+ }
235
+
236
+ impl CommitInfo {
237
+ fn new ( commit : Oid , refs : Vec < String > ) -> CommitInfo {
238
+ CommitInfo { commit, refs }
239
+ }
240
+ }
241
+
242
+ impl fmt:: Display for CommitInfo {
243
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
244
+ if self . refs . len ( ) > 0 {
245
+ let refs_str = self . refs . iter ( ) . map ( |ref_name| {
246
+ ref_name. as_str ( )
247
+ } ) . collect :: < Vec < & str > > ( ) . join ( ", " ) ;
248
+ write ! ( f, "{} ({})" , self . commit, refs_str)
249
+ } else {
250
+ write ! ( f, "{}" , self . commit)
251
+ }
252
+ }
253
+ }
254
+
223
255
#[ derive( PartialEq , Eq , Hash , Clone ) ]
224
256
enum Language {
225
257
Assembly ,
@@ -303,13 +335,15 @@ fn main() -> Result<()> {
303
335
let dominant_language = languages_stat_vec[ 0 ] . 0 . clone ( ) ;
304
336
305
337
let authors = get_authors ( & dir, 3 ) ;
338
+ let current_commit_info = get_current_commit_info ( & dir) ?;
306
339
let config = get_configuration ( & dir) ?;
307
340
let version = get_version ( & dir) ?;
308
341
let commits = get_commits ( & dir) ?;
309
342
let last_change = get_last_change ( & dir) ?;
310
343
311
344
let info = Info {
312
345
project_name : config. repository_name ,
346
+ current_commit : current_commit_info,
313
347
version,
314
348
dominant_language,
315
349
languages : languages_stat_vec,
@@ -527,6 +561,31 @@ fn get_authors(dir: &str, n: usize) -> Vec<String> {
527
561
authors
528
562
}
529
563
564
+ fn get_current_commit_info ( dir : & str ) -> Result < CommitInfo > {
565
+ let repo = Repository :: open ( dir) . map_err ( |_| Error :: NotGitRepo ) ?;
566
+ let head = repo. head ( ) . map_err ( |_| Error :: ReferenceInfoError ) ?;
567
+ let head_oid = head. target ( ) . ok_or ( Error :: ReferenceInfoError ) ?;
568
+ let refs = repo. references ( ) . map_err ( |_| Error :: ReferenceInfoError ) ?;
569
+ let refs_info = refs. into_iter ( ) . filter_map ( |reference| {
570
+ match reference {
571
+ Ok ( reference) => {
572
+ match ( reference. target ( ) , reference. shorthand ( ) ) {
573
+ ( Some ( oid) , Some ( shorthand) ) if oid == head_oid => {
574
+ Some ( if reference. is_tag ( ) {
575
+ String :: from ( "tags/" ) + shorthand
576
+ } else {
577
+ String :: from ( shorthand)
578
+ } )
579
+ } ,
580
+ _ => None
581
+ }
582
+ } ,
583
+ Err ( _) => None ,
584
+ }
585
+ } ) . collect :: < Vec < String > > ( ) ;
586
+ Ok ( CommitInfo :: new ( head_oid, refs_info) )
587
+ }
588
+
530
589
fn get_total_loc ( languages : & tokei:: Languages ) -> usize {
531
590
languages
532
591
. values ( )
@@ -670,6 +729,8 @@ enum Error {
670
729
ReadDirectory ,
671
730
/// Not in a Git Repo
672
731
NotGitRepo ,
732
+ /// Error while getting branch info
733
+ ReferenceInfoError ,
673
734
}
674
735
675
736
impl fmt:: Debug for Error {
@@ -680,6 +741,7 @@ impl fmt::Debug for Error {
680
741
Error :: NoGitData => "Could not retrieve git configuration data" ,
681
742
Error :: ReadDirectory => "Could not read directory" ,
682
743
Error :: NotGitRepo => "This is not a Git Repo" ,
744
+ Error :: ReferenceInfoError => "Error while retrieving reference information" ,
683
745
} ;
684
746
write ! ( f, "{}" , content)
685
747
}
0 commit comments