Skip to content

Commit 5bdd071

Browse files
committed
Add a test to also validate interaction with known_common/remote refs
1 parent 1b19ab1 commit 5bdd071

File tree

5 files changed

+67
-27
lines changed

5 files changed

+67
-27
lines changed

gix-negotiate/src/consecutive.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,14 @@ impl<'a> Algorithm<'a> {
3535
/// Add `id` to our priority queue and *add* `flags` to it.
3636
fn add_to_queue(&mut self, id: ObjectId, mark: Flags) -> Result<(), Error> {
3737
let mut is_common = false;
38-
let mut had_mark = false;
38+
if self.graph.get(&id).map_or(false, |flags| flags.intersects(mark)) {
39+
return Ok(());
40+
}
3941
let commit = self.graph.try_lookup_and_insert(id, |current| {
40-
had_mark = current.contains(mark);
4142
*current |= mark;
4243
is_common = current.contains(Flags::COMMON);
4344
})?;
44-
if let Some(timestamp) = commit
45-
.filter(|_| !had_mark)
46-
.map(|c| c.committer_timestamp())
47-
.transpose()?
48-
{
45+
if let Some(timestamp) = commit.map(|c| c.committer_timestamp()).transpose()? {
4946
self.revs.insert(timestamp, id);
5047
if !is_common {
5148
self.non_common_revs += 1;

gix-negotiate/src/skipping.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ impl<'a> Algorithm<'a> {
7777
.get(&id)
7878
.map_or(false, |entry| entry.flags.contains(Flags::POPPED))
7979
{
80-
self.non_common_revs -= 1;
80+
self.non_common_revs = self.non_common_revs.saturating_sub(1);
8181
}
8282
if let Some(commit) = self.graph.try_lookup_and_insert(id, |entry| {
8383
if !entry.flags.contains(Flags::POPPED) {

gix-negotiate/tests/baseline/mod.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ use std::cell::RefCell;
99
#[test]
1010
fn run() -> crate::Result {
1111
let root = gix_testtools::scripted_fixture_read_only("make_repos.sh")?;
12-
for case in ["no_parents", "clock_skew", "two_colliding_skips", "multi_round"] {
12+
for case in [
13+
"no_parents",
14+
"clock_skew",
15+
"two_colliding_skips",
16+
"multi_round",
17+
"advertisement_as_filter",
18+
] {
1319
let base = root.join(case);
1420

1521
for (algo_name, algo) in [
@@ -55,6 +61,13 @@ fn run() -> crate::Result {
5561
cache,
5662
);
5763
eprintln!("ALGO {algo_name} CASE {case}");
64+
// for (common, remote_ref) in ["origin/main"]
65+
// .into_iter()
66+
// .filter_map(|name| refs.try_find(name).ok().flatten().map(|r| (r.target.into_id(), name)))
67+
// {
68+
// eprintln!("COMMON {remote_ref} {common}", common = message(common));
69+
// negotiator.known_common(common)?;
70+
// }
5871
for tip in &tips {
5972
eprintln!("TIP {}", message(*tip));
6073
negotiator.add_tip(*tip)?;
@@ -80,11 +93,18 @@ fn run() -> crate::Result {
8093
"b4.c1", "b3.c1", "b2.c1", "b8.c0", "b7.c0", "b6.c0", "b5.c0", "b4.c0", "b3.c0",
8194
"b2.c0",
8295
]);
96+
} else if case == "advertisement_as_filter" {
97+
haves = lookup_names(&["c2side", "c5", "origin/main"])
98+
.into_iter()
99+
.chain(Some(
100+
gix_hash::ObjectId::from_hex(b"f36cefa0be2ac180d360a54b1cc4214985cea60a").unwrap(),
101+
))
102+
.collect();
83103
}
84104
}
85105
for have in haves {
86106
let actual = negotiator.next_have().unwrap_or_else(|| {
87-
panic!("{algo_name}:cache={use_cache}: one have per baseline: {have} missing or in wrong order")
107+
panic!("{algo_name}:cache={use_cache}: one have per baseline: {have} missing or in wrong order", have = message(have))
88108
})?;
89109
assert_eq!(
90110
actual,
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:4ab34b3fcd172c7b20c376b4d52d3790feaacb3eb0e55836ba122bcce88b94b7
3-
size 88300
2+
oid sha256:c7b182238625bb6111d042ef5d500dc62606f53f1004ec7a89e28f7ec6fd3306
3+
size 92848

gix-negotiate/tests/fixtures/make_repos.sh

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ function negotiation_tips () {
3333
}
3434

3535
function trace_fetch_baseline () {
36+
local remote="${1:?need remote url}"; shift
3637
git -C client commit-graph write --no-progress --reachable
3738
git -C client repack -adq
3839

@@ -41,29 +42,29 @@ function trace_fetch_baseline () {
4142
GIT_TRACE_PACKET="$PWD/baseline.$algo" \
4243
git -C client -c fetch.negotiationAlgorithm="$algo" fetch --negotiate-only $(negotiation_tips "$@") \
4344
--upload-pack 'unset GIT_TRACE_PACKET; git-upload-pack' \
44-
file://$PWD/server || :
45+
"$remote" || :
4546
done
4647
}
4748

4849

4950
(mkdir no_parents && cd no_parents
50-
(git init -q server && cd server
51+
git init -q server && cd server
5152
commit to_fetch
52-
)
53+
cd ..
5354

5455
(git init -q client && cd client
5556
for i in $(seq 7); do
5657
commit c$i
5758
done
5859
)
5960

60-
trace_fetch_baseline main
61+
trace_fetch_baseline file://$PWD/server main
6162
)
6263

6364
(mkdir two_colliding_skips && cd two_colliding_skips
64-
(git init -q server && cd server
65+
git init -q server && cd server
6566
commit to_fetch
66-
)
67+
cd ..
6768

6869
(git init -q client && cd client
6970
for i in $(seq 11); do
@@ -73,15 +74,37 @@ function trace_fetch_baseline () {
7374
commit c5side
7475
)
7576

76-
trace_fetch_baseline HEAD main
77+
trace_fetch_baseline file://$PWD/server HEAD main
7778
)
7879

79-
(mkdir multi_round && cd multi_round
80-
(git init -q server && cd server
80+
(mkdir advertisement_as_filter && cd advertisement_as_filter
81+
git init -q server && cd server
82+
commit c1
83+
commit c2
84+
commit c3
85+
git tag -d c1 c2 c3
86+
cd ..
87+
git clone server client && cd client
88+
commit c4
89+
commit c5
90+
git checkout c4^^
91+
commit c2side
92+
cd ..
93+
(cd server
94+
git checkout --orphan anotherbranch
8195
commit to_fetch
8296
)
8397

84-
(git init -q client && cd client
98+
trace_fetch_baseline origin HEAD main
99+
)
100+
101+
102+
(mkdir multi_round && cd multi_round
103+
git init -q server && cd server
104+
commit to_fetch
105+
cd ..
106+
107+
git init -q client && cd client
85108
for i in $(seq 8); do
86109
git checkout --orphan b$i &&
87110
commit b$i.c0
@@ -93,19 +116,19 @@ function trace_fetch_baseline () {
93116
commit b$i.c$j
94117
done
95118
done
96-
)
119+
cd ..
97120
(cd server
98121
git fetch --no-tags "$PWD/../client" b1:refs/heads/b1
99122
git checkout b1
100123
commit commit-on-b1
101124
)
102-
trace_fetch_baseline $(ls client/.git/refs/heads | sort)
125+
trace_fetch_baseline file://$PWD/server $(ls client/.git/refs/heads | sort)
103126
)
104127

105128
(mkdir clock_skew && cd clock_skew
106-
(git init -q server && cd server
129+
git init -q server && cd server
107130
commit to_fetch
108-
)
131+
cd ..
109132

110133
(git init -q client && cd client
111134
tick=2000000000
@@ -120,5 +143,5 @@ function trace_fetch_baseline () {
120143
commit old4
121144
)
122145

123-
trace_fetch_baseline HEAD main
146+
trace_fetch_baseline file://$PWD/server HEAD main
124147
)

0 commit comments

Comments
 (0)