Skip to content

Commit f1d816b

Browse files
authored
Merge pull request #1 from codetit4n/kvlm-debug
kvlm bugs fixed
2 parents 60ae750 + ea47009 commit f1d816b

File tree

4 files changed

+44
-35
lines changed

4 files changed

+44
-35
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
### Install `gitr`
77

88
```bash
9-
./install.sh
9+
sh install.sh
1010
```
1111

1212
### Run

src/git/helpers.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ fn log_graphviz(repo: &GitRepository, sha: &str, seen: &mut HashSet<String>) {
131131
.expect("Not a commit object");
132132
let short_hash = &sha[0..8];
133133
let message = commit.kvlm.get(&None).unwrap();
134-
let message = std::str::from_utf8(&message).unwrap().trim();
134+
let message = std::str::from_utf8(&message[0]).unwrap().trim();
135135
let message = message.replace("\\", "\\\\").replace("\"", "\\\"");
136136
let message = if message.contains("\n") {
137137
let index = message.find("\n").unwrap();
@@ -148,13 +148,9 @@ fn log_graphviz(repo: &GitRepository, sha: &str, seen: &mut HashSet<String>) {
148148

149149
let parents = commit.kvlm.get(&Some(b"parent".to_vec())).unwrap();
150150

151-
let parents: Vec<String> = match str::from_utf8(parents) {
152-
Ok(s) => s.split_whitespace().map(String::from).collect(),
153-
Err(_) => vec![],
154-
};
155-
156151
for p in parents {
157-
println!(" c_{0} -> c_{1};", sha, p);
158-
log_graphviz(repo, &p, seen);
152+
let parent_str = String::from_utf8(p.clone()).unwrap(); // Decode parent as ASCII string
153+
println!(" c_{} -> c_{};", sha, parent_str); // Print parent relationship
154+
log_graphviz(repo, &parent_str, seen);
159155
}
160156
}

src/git/objects/commit.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1+
use crate::git::objects::kvlm::Dict;
12
use crate::git::objects::kvlm::{kvlm_parse, kvlm_serialize};
23
use crate::git::objects::objects::GitObject;
34
use crate::git::repo::GitRepository;
4-
use ordermap::OrderMap;
55
use std::any::Any;
66

77
#[derive(Debug)]
88
pub struct GitCommit {
99
pub fmt: Vec<u8>,
10-
pub kvlm: OrderMap<Option<Vec<u8>>, Vec<u8>>,
10+
pub kvlm: Dict,
1111
}
1212

1313
impl GitObject for GitCommit {

src/git/objects/kvlm.rs

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use ordermap::OrderMap;
22

3-
pub fn kvlm_parse(
4-
raw: &[u8],
5-
start: usize,
6-
mut dct: Option<OrderMap<Option<Vec<u8>>, Vec<u8>>>,
7-
) -> OrderMap<Option<Vec<u8>>, Vec<u8>> {
3+
type Value = Vec<Vec<u8>>;
4+
5+
pub type Dict = OrderMap<Option<Vec<u8>>, Value>;
6+
7+
pub fn kvlm_parse(raw: &[u8], start: usize, mut dct: Option<Dict>) -> Dict {
88
if dct.is_none() {
99
dct = Some(OrderMap::new());
1010
}
@@ -21,7 +21,8 @@ pub fn kvlm_parse(
2121

2222
if spc.is_none() || (nl.is_some() && nl.unwrap() < spc.unwrap()) {
2323
assert_eq!(nl.unwrap(), start);
24-
dct.insert(None, raw[start + 1..].to_vec());
24+
dct.insert(None, vec![raw[start + 1..].to_vec()]);
25+
2526
return dct;
2627
}
2728

@@ -55,40 +56,44 @@ pub fn kvlm_parse(
5556
}
5657

5758
if let Some(existing_value) = dct.get_mut(&Some(key.to_vec())) {
58-
if existing_value.is_empty() {
59-
*existing_value = value;
60-
} else {
61-
existing_value.extend(value);
62-
}
59+
existing_value.push(value);
6360
} else {
64-
dct.insert(Some(key.to_vec()), value);
61+
dct.insert(Some(key.to_vec()), vec![value]);
6562
}
6663

6764
kvlm_parse(raw, end + 1, Some(dct))
6865
}
6966

70-
pub fn kvlm_serialize(kvlm: OrderMap<Option<Vec<u8>>, Vec<u8>>) -> Vec<u8> {
67+
pub fn kvlm_serialize(kvlm: Dict) -> Vec<u8> {
7168
let mut ret: Vec<u8> = Vec::new();
7269
for key in kvlm.keys() {
7370
if key.is_none() {
7471
continue;
7572
}
7673
let val = kvlm.get(key).unwrap();
77-
let val = val.clone();
7874

7975
for v in val.iter() {
8076
ret.extend(key.clone().unwrap());
8177
ret.push(b' ');
82-
if *v == b'\n' {
83-
ret.extend(b"\n ");
84-
}
78+
v.iter().for_each(|c| {
79+
if *c == b'\n' {
80+
ret.extend(b"\n ");
81+
} else {
82+
ret.push(*c);
83+
}
84+
});
8585
ret.push(b'\n');
8686
}
8787
}
8888

8989
// Append the message
9090
ret.push(b'\n');
91-
ret.extend(kvlm.get(&None).unwrap());
91+
ret.extend(
92+
kvlm.get(&None)
93+
.unwrap()
94+
.iter()
95+
.flat_map(|x| x.iter().cloned()),
96+
);
9297
ret.push(b'\n');
9398

9499
ret
@@ -126,29 +131,35 @@ Create first draft";
126131
let map = kvlm_parse(raw, 0, None);
127132

128133
assert_eq!(map.len(), 6);
134+
129135
assert_eq!(
130136
map.get(&Some(b"tree".to_vec())).unwrap(),
131-
b"29ff16c9c14e2652b22f8b78bb08a5a07930c147"
137+
&vec![b"29ff16c9c14e2652b22f8b78bb08a5a07930c147".to_vec()]
132138
);
139+
133140
assert_eq!(
134141
map.get(&Some(b"parent".to_vec())).unwrap(),
135-
b"206941306e8a8af65b66eaaaea388a7ae24d49a0"
142+
&vec![b"206941306e8a8af65b66eaaaea388a7ae24d49a0".to_vec()]
136143
);
144+
137145
assert_eq!(
138146
map.get(&Some(b"author".to_vec())).unwrap(),
139-
b"Thibault Polge <[email protected]> 1527025023 +0200"
147+
&vec![b"Thibault Polge <[email protected]> 1527025023 +0200".to_vec()]
140148
);
141149
assert_eq!(
142150
map.get(&Some(b"committer".to_vec())).unwrap(),
143-
b"Thibault Polge <[email protected]> 1527025044 +0200"
151+
&vec![b"Thibault Polge <[email protected]> 1527025044 +0200".to_vec()]
144152
);
153+
145154
assert_eq!(
146155
map.get(&Some(b"gpgsig".to_vec())).unwrap(),
147-
b"-----BEGIN PGP SIGNATURE-----"
156+
&vec![b"-----BEGIN PGP SIGNATURE-----".to_vec()]
148157
);
158+
149159
assert_eq!(
150160
map.get(&None).unwrap(),
151-
b" iQIzBAABCAAdFiEExwXquOM8bWb4Q2zVGxM2FxoLkGQFAlsEjZQACgkQGxM2FxoL
161+
&vec![
162+
b" iQIzBAABCAAdFiEExwXquOM8bWb4Q2zVGxM2FxoLkGQFAlsEjZQACgkQGxM2FxoL
152163
kGQdcBAAqPP+ln4nGDd2gETXjvOpOxLzIMEw4A9gU6CzWzm+oB8mEIKyaH0UFIPh
153164
rNUZ1j7/ZGFNeBDtT55LPdPIQw4KKlcf6kC8MPWP3qSu3xHqx12C5zyai2duFZUU
154165
wqOt9iCFCscFQYqKs3xsHI+ncQb+PGjVZA8+jPw7nrPIkeSXQV2aZb1E68wa2YIL
@@ -164,6 +175,8 @@ Create first draft";
164175
-----END PGP SIGNATURE-----
165176
166177
Create first draft"
178+
.to_vec()
179+
]
167180
);
168181
}
169182
}

0 commit comments

Comments
 (0)