1
1
pub ( crate ) mod function {
2
- use std:: { borrow:: Cow , ffi:: OsString } ;
3
-
2
+ use crate :: OutputFormat ;
4
3
use anyhow:: { bail, Context } ;
4
+ use gix:: odb:: store:: RefreshMode ;
5
+ use gix:: revision:: plumbing:: Spec ;
5
6
use gix:: { prelude:: ObjectIdExt , revision:: walk:: Sorting } ;
6
-
7
- use crate :: OutputFormat ;
7
+ use std :: fmt :: Formatter ;
8
+ use std :: { borrow :: Cow , ffi :: OsString } ;
8
9
9
10
pub fn list (
10
11
mut repo : gix:: Repository ,
11
12
spec : OsString ,
12
13
mut out : impl std:: io:: Write ,
14
+ long_hashes : bool ,
13
15
format : OutputFormat ,
14
16
) -> anyhow:: Result < ( ) > {
15
17
if format != OutputFormat :: Human {
@@ -19,37 +21,70 @@ pub(crate) mod function {
19
21
. commit_graph ( )
20
22
. context ( "a commitgraph is required, but none was found" ) ?;
21
23
repo. object_cache_size_if_unset ( 4 * 1024 * 1024 ) ;
24
+ repo. objects . refresh = RefreshMode :: Never ;
22
25
23
26
let spec = gix:: path:: os_str_into_bstr ( & spec) ?;
24
- let id = repo
25
- . rev_parse_single ( spec)
26
- . context ( "Only single revisions are currently supported" ) ?;
27
- let commits = id
28
- . object ( ) ?
29
- . peel_to_kind ( gix:: object:: Kind :: Commit )
30
- . context ( "Need committish as starting point" ) ?
31
- . id ( )
32
- . ancestors ( )
33
- . sorting ( Sorting :: ByCommitTime ( Default :: default ( ) ) )
34
- . all ( ) ?;
27
+ let spec = repo. rev_parse ( spec) ?. detach ( ) ;
28
+ let commits = match spec {
29
+ Spec :: Include ( id) => connected_commit_id ( & repo, id) ?
30
+ . ancestors ( )
31
+ . sorting ( Sorting :: ByCommitTime ( Default :: default ( ) ) )
32
+ . all ( ) ?,
33
+ Spec :: Range { from, to } => connected_commit_id ( & repo, to) ?
34
+ . ancestors ( )
35
+ . sorting ( Sorting :: ByCommitTime ( Default :: default ( ) ) )
36
+ . with_hidden ( Some ( connected_commit_id ( & repo, from) ?) )
37
+ . all ( ) ?,
38
+ Spec :: Exclude ( _) | Spec :: Merge { .. } | Spec :: IncludeOnlyParents ( _) | Spec :: ExcludeParents ( _) => {
39
+ bail ! ( "The spec isn't currently supported: {spec:?}" )
40
+ }
41
+ } ;
35
42
for commit in commits {
36
43
let commit = commit?;
37
44
writeln ! (
38
45
out,
39
46
"{} {} {} {}" ,
40
- commit. id( ) . shorten_or_id ( ) ,
47
+ HexId :: new ( commit. id( ) , long_hashes ) ,
41
48
commit. commit_time. expect( "traversal with date" ) ,
42
49
commit. parent_ids. len( ) ,
43
50
graph. commit_by_id( commit. id) . map_or_else(
44
51
|| Cow :: Borrowed ( "<NOT IN GRAPH-CACHE>" ) ,
45
52
|c| Cow :: Owned ( format!(
46
53
"{} {}" ,
47
- c. root_tree_id( ) . to_owned( ) . attach( & repo) . shorten_or_id ( ) ,
54
+ HexId :: new ( c. root_tree_id( ) . to_owned( ) . attach( & repo) , long_hashes ) ,
48
55
c. generation( )
49
56
) )
50
57
)
51
58
) ?;
52
59
}
53
60
Ok ( ( ) )
54
61
}
62
+
63
+ fn connected_commit_id ( repo : & gix:: Repository , id : gix:: ObjectId ) -> anyhow:: Result < gix:: Id < ' _ > > {
64
+ Ok ( id
65
+ . attach ( & repo)
66
+ . object ( ) ?
67
+ . peel_to_kind ( gix:: object:: Kind :: Commit )
68
+ . context ( "Need committish as starting point" ) ?
69
+ . id ( ) )
70
+ }
71
+
72
+ struct HexId < ' a > ( gix:: Id < ' a > , bool ) ;
73
+
74
+ impl < ' a > HexId < ' a > {
75
+ pub fn new ( id : gix:: Id < ' a > , long_hex : bool ) -> Self {
76
+ HexId ( id, long_hex)
77
+ }
78
+ }
79
+
80
+ impl < ' a > std:: fmt:: Display for HexId < ' a > {
81
+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
82
+ let HexId ( id, long_hex) = self ;
83
+ if * long_hex {
84
+ id. fmt ( f)
85
+ } else {
86
+ id. shorten_or_id ( ) . fmt ( f)
87
+ }
88
+ }
89
+ }
55
90
}
0 commit comments