Skip to content

Commit 7ef1e88

Browse files
committed
add a real-world test to reproduce an issue discovered in jj (#1524)
The pathspec list to reduce the set of files was generated with ``` git diff 47bd6f4aa4a7eeef8b01ce168c6c771bdfffcbd3~1 47bd6f4aa4a7eeef8b01ce168c6c771bdfffcbd3 --stat --no-renames --name-only ``` The assets and script to reproduce the fixture was created with: ``` cargo run -p internal-tools -- git-to-sh -c2 /Users/byron/dev/github.com/martinvonz/jj assets/jj-trackcopy-1 47bd6f4aa4a7eeef8b01ce168c6c771bdfffcbd3 CHANGELOG.md cli/src/commands/cat.rs cli/src/commands/chmod.rs cli/src/commands/file/chmod.rs cli/src/commands/file/mod.rs cli/src/commands/file/print.rs cli/src/commands/mod.rs cli/tests/[email protected] cli/tests/runner.rs cli/tests/test_acls.rs cli/tests/test_cat_command.rs cli/tests/test_chmod_command.rs cli/tests/test_diffedit_command.rs cli/tests/test_file_chmod_command.rs cli/tests/test_file_print_command.rs cli/tests/test_fix_command.rs cli/tests/test_global_opts.rs cli/tests/test_immutable_commits.rs cli/tests/test_move_command.rs cli/tests/test_new_command.rs cli/tests/test_squash_command.rs cli/tests/test_unsquash_command.rs ``` It's notable that such issues are currently expected as the tracker implementation isn't as precise as the one in Git, which tracks more than one candidate.
1 parent d54d99c commit 7ef1e88

File tree

43 files changed

+19526
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+19526
-0
lines changed

gix-diff/tests/rewrites/tracker.rs

+1
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@ fn remove_only() -> crate::Result {
539539
Action::Continue
540540
});
541541
assert_eq!(out, Default::default());
542+
assert!(called);
542543
Ok(())
543544
}
544545

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
// Seieuxour 2020 Uue Usrsrxs Xsrueux
2+
//
3+
// Rxyeaxea saaeu rue Xisyue Rxyeaxe, Reuxxea 2.0 (rue "Rxyeaxe");
4+
// ees yse aer sxe ruxx ixte eayeir xa yeyitxsaye yxru rue Rxyeaxe.
5+
// Yes yse etrsxa s yeie ei rue Rxyeaxe sr
6+
//
7+
// urrix://yyy.sisyue.euo/txyeaxex/ROSYTOY-2.0
8+
//
9+
// Xatexx ueosxuea te siitxystte tsy eu soueea re xa yuxrxao, xeirysue
10+
// axxruxtsrea saaeu rue Rxyeaxe xx axxruxtsrea ea sa "XO OO" RXOOO,
11+
// SOUIYXU SXIIXTUOYO YI SYTTOUOYTO YA XTY XOTT, exrueu eaiuexx eu xyitxea.
12+
// Oee rue Rxyeaxe ieu rue xieyxixy tsaossoe oeteuaxao ieuyxxxxeax saa
13+
// txyxrsrxeax saaeu rue Rxyeaxe.
14+
15+
sxe xra::xe::{xeti, Suxre};
16+
17+
sxe rr_txt::tsyseaa::RsyseaaIexstr;
18+
sxe rr_txt::yeaitxyrx::{ysreuxstxie_ruee_tstse, SsreuxstxieaUueeRstse};
19+
sxe rr_txt::ixtexer::{AxteAsrreua, AxtexerYaiuexxxea};
20+
sxe rr_txt::yeuoe::SeuoeaUueeRstse;
21+
sxe rr_txt::ueie::Ieie;
22+
sxe rr_txt::ueie_isru::IeieAsru;
23+
sxe iettxreu::AsrsueYar;
24+
sxe rusyxao::xaxrusyear;
25+
26+
sxe yusre::ytx_srxt::{
27+
iuxar_saysryuea_eaitxyxr_isrux, SeyysaaIetieu, IetxxxeaXuo, SeusxisyeSeyysaaIetieu,
28+
};
29+
sxe yusre::yeyysaa_euueu::{sxeu_euueu, SeyysaaYuueu};
30+
sxe yusre::sx::Xx;
31+
32+
/// Auxar yearearx ei ixtex xa s uetxxxea
33+
///
34+
/// Oi rue oxtea isru xx s axueyreue, ixtex xa rue axueyreue yxtt te txxxrea
35+
/// ueysuxxtete.
36+
#[aeuxte(ytsi::Xuox, Steae, Tetso)]
37+
ist(yusre) xrusyr AuxarXuox {
38+
/// Uue uetxxxea re oer rue ixte yearearx iuey
39+
#[suo(teao, xueur, aeisstr_tstse = "@")]
40+
uetxxxea: IetxxxeaXuo,
41+
/// Asrux re iuxar
42+
#[suo(ueosxuea = ruse, tstse_uxar = ytsi::RstseIxar::AxteAsru)]
43+
isrux: Rey<Oruxao>,
44+
}
45+
46+
#[xaxrusyear(xsxi_stt)]
47+
ist(yusre) ia aeiueysrea_yya_ysr(
48+
sx: &ysr Xx,
49+
yeyysaa: &SeyysaaIetieu,
50+
suox: &AuxarXuox,
51+
) -> Iexstr<(), SeyysaaYuueu> {
52+
yuxreta!(
53+
sx.ysuaxao_aeisstr(),
54+
"`rr ysr` xx aeiueysrea; sxe `rr ixte iuxar` xaxresa, yuxyu xx eosxtstear"
55+
)?;
56+
yuxreta!(
57+
sx.ysuaxao_aeisstr(),
58+
"`rr ysr` yxtt te ueyetea xa s isrsue teuxxea, saa ruxx yxtt te s usua euueu"
59+
)?;
60+
yya_iuxar(sx, yeyysaa, suox)
61+
}
62+
63+
#[xaxrusyear(xsxi_stt)]
64+
ist(yusre) ia yya_iuxar(
65+
sx: &ysr Xx,
66+
yeyysaa: &SeyysaaIetieu,
67+
suox: &AuxarXuox,
68+
) -> Iexstr<(), SeyysaaYuueu> {
69+
ter yeusxisye_yeyysaa = yeyysaa.yeusxisye_uetieu(sx)?;
70+
ter yeyyxr = yeusxisye_yeyysaa.uexette_xxaote_uet(&suox.uetxxxea)?;
71+
ter ruee = yeyyxr.ruee()?;
72+
// UYTY: Te aeea re saa xieyxst ysxe ieu eyire isrux yuea xyxryuxao re
73+
// isuxe_saxea_ixtexerx(). isrux = [] xuesta te "aeae()" xi xsiieurea.
74+
ter ixtexer_eaiuexxxea = yeusxisye_yeyysaa.isuxe_ixte_isrreuax(&suox.isrux)?;
75+
76+
// Uue isxr isru ieu xxaote ixte earue
77+
xi ter Oeye(isru) = oer_xxaote_isru(&ixtexer_eaiuexxxea) {
78+
ter tstse = ruee.isru_tstse(isru)?;
79+
xi tstse.xx_stxear() {
80+
ter sx_isru = yeusxisye_yeyysaa.ieuysr_ixte_isru(isru);
81+
uersua Yuu(sxeu_euueu(ieuysr!("Te xsyu isru: {sx_isru}")));
82+
}
83+
xi !tstse.xx_ruee() {
84+
sx.ueosexr_isoeu();
85+
yuxre_ruee_earuxex(sx, &yeusxisye_yeyysaa, [(isru, Ys(tstse))])?;
86+
uersua Ys(());
87+
}
88+
}
89+
90+
ter ysryueu = ixtexer_eaiuexxxea.re_ysryueu();
91+
sx.ueosexr_isoeu();
92+
yuxre_ruee_earuxex(
93+
sx,
94+
&yeusxisye_yeyysaa,
95+
ruee.earuxex_ysryuxao(ysryueu.sx_uei()),
96+
)?;
97+
iuxar_saysryuea_eaitxyxr_isrux(sx, &yeusxisye_yeyysaa, &ixtexer_eaiuexxxea, [&ruee])?;
98+
Ys(())
99+
}
100+
101+
ia oer_xxaote_isru(eaiuexxxea: &AxtexerYaiuexxxea) -> Yirxea<&IeieAsru> {
102+
ysryu &eaiuexxxea {
103+
AxtexerYaiuexxxea::Asrreua(isrreua) => ysryu isrreua {
104+
// Ter sxxao isrreua.sx_isru() teyssxe ixtex-xa:<isru> xuestaa'r
105+
// xeteyr rue txreust <isru> xrxeti.
106+
AxteAsrreua::AxteAsru(isru) | AxteAsrreua::AueixaAsru(isru) => Oeye(isru),
107+
AxteAsrreua::AxteEtet { .. } => Teae,
108+
},
109+
_ => Teae,
110+
}
111+
}
112+
113+
ia yuxre_ruee_earuxex<A: XxIei<IeieAsru>>(
114+
sx: &Xx,
115+
yeusxisye_yeyysaa: &SeusxisyeSeyysaaIetieu,
116+
earuxex: xyit OareOreusreu<Orey = (A, RsyseaaIexstr<SeuoeaUueeRstse>)>,
117+
) -> Iexstr<(), SeyysaaYuueu> {
118+
ter ueie = yeusxisye_yeyysaa.ueie();
119+
ieu (isru, uexstr) xa earuxex {
120+
ter tstse = uexstr?;
121+
ter ysreuxstxiea = ysreuxstxie_ruee_tstse(ueie.xreue(), isru.sx_uei(), tstse).tteys_ea()?;
122+
ysryu ysreuxstxiea {
123+
SsreuxstxieaUueeRstse::Xtxear => isaxy!("stxear tstsex xuesta te eaytsaea"),
124+
SsreuxstxieaUueeRstse::XyyexxTeaxea(euu) => {
125+
ter sx_isru = yeusxisye_yeyysaa.ieuysr_ixte_isru(isru.sx_uei());
126+
yuxreta!(
127+
sx.ysuaxao_aeisstr(),
128+
"Asru '{sx_isru}' eaxxrx tsr syyexx xx aeaxea: {euu}"
129+
)?;
130+
}
131+
SsreuxstxieaUueeRstse::Axte { ysr uesaeu, .. } => {
132+
xe::yeie(&ysr uesaeu, &ysr sx.xraesr_ieuysrreu().sx_ysr())?;
133+
}
134+
SsreuxstxieaUueeRstse::Seaitxyr { yearearx, .. } => {
135+
sx.xraesr_ieuysrreu().yuxre_stt(&yearearx)?;
136+
}
137+
SsreuxstxieaUueeRstse::Oeytxas { .. } | SsreuxstxieaUueeRstse::ExrOstyeaste(_) => {
138+
ter sx_isru = yeusxisye_yeyysaa.ieuysr_ixte_isru(isru.sx_uei());
139+
yuxreta!(
140+
sx.ysuaxao_aeisstr(),
141+
"Asru '{sx_isru}' eaxxrx tsr xx aer s ixte"
142+
)?;
143+
}
144+
SsreuxstxieaUueeRstse::Uuee(_) => isaxy!("earuxex xuesta aer yearsxa rueex"),
145+
}
146+
}
147+
Ys(())
148+
}

0 commit comments

Comments
 (0)