@@ -1058,3 +1058,91 @@ fn v3_and_git_url_encoded_tag() {
1058
1058
fn v3_and_git_url_encoded_rev() {
1059
1059
v3_and_git_url_encoded("rev", create_tag);
1060
1060
}
1061
+
1062
+ fn v4_and_git_url_encoded(ref_kind: &str, f: impl FnOnce(&git2::Repository, &str, git2::Oid)) {
1063
+ let (git_project, repo) = git::new_repo("dep1", |project| {
1064
+ project
1065
+ .file("Cargo.toml", &basic_lib_manifest("dep1"))
1066
+ .file("src/lib.rs", "")
1067
+ });
1068
+ let url = git_project.url();
1069
+ let head_id = repo.head().unwrap().target().unwrap();
1070
+ // Ref name with special characters
1071
+ let git_ref = "a-_+#$)";
1072
+ let encoded_ref = "a-_%2B%23%24%29";
1073
+ f(&repo, git_ref, head_id);
1074
+
1075
+ let lockfile = format!(
1076
+ r#"# This file is automatically @generated by Cargo.
1077
+ # It is not intended for manual editing.
1078
+ version = 4
1079
+
1080
+ [[package]]
1081
+ name = "dep1"
1082
+ version = "0.5.0"
1083
+ source = "git+{url}?{ref_kind}={encoded_ref}#{head_id}"
1084
+
1085
+ [[package]]
1086
+ name = "foo"
1087
+ version = "0.0.1"
1088
+ dependencies = [
1089
+ "dep1",
1090
+ ]
1091
+ "#,
1092
+ );
1093
+
1094
+ let p = project()
1095
+ .file(
1096
+ "Cargo.toml",
1097
+ &format!(
1098
+ r#"
1099
+ [package]
1100
+ name = "foo"
1101
+ version = "0.0.1"
1102
+
1103
+ [dependencies]
1104
+ dep1 = {{ git = '{url}', {ref_kind} = '{git_ref}' }}
1105
+ "#,
1106
+ ),
1107
+ )
1108
+ .file("src/lib.rs", "")
1109
+ .file("Cargo.lock", "version = 4")
1110
+ .build();
1111
+
1112
+ p.cargo("check -Znext-lockfile-bump")
1113
+ .masquerade_as_nightly_cargo(&["-Znext-lockfile-bump"])
1114
+ .with_stderr(format!(
1115
+ "\
1116
+ [UPDATING] git repository `{url}`
1117
+ [CHECKING] dep1 v0.5.0 ({url}?{ref_kind}={git_ref}#[..])
1118
+ [CHECKING] foo v0.0.1 ([CWD])
1119
+ [FINISHED] dev [..]
1120
+ "
1121
+ ))
1122
+ .run();
1123
+
1124
+ let lock = p.read_lockfile();
1125
+ assert_match_exact(&lockfile, &lock);
1126
+
1127
+ // Unlike v3_and_git_url_encoded, v4 encodes URL parameters so no git
1128
+ // repository re-clone happen.
1129
+ p.cargo("check -Znext-lockfile-bump")
1130
+ .masquerade_as_nightly_cargo(&["-Znext-lockfile-bump"])
1131
+ .with_stderr("[FINISHED] dev [..]")
1132
+ .run();
1133
+ }
1134
+
1135
+ #[cargo_test]
1136
+ fn v4_and_git_url_encoded_branch() {
1137
+ v4_and_git_url_encoded("branch", create_branch);
1138
+ }
1139
+
1140
+ #[cargo_test]
1141
+ fn v4_and_git_url_encoded_tag() {
1142
+ v4_and_git_url_encoded("tag", create_tag);
1143
+ }
1144
+
1145
+ #[cargo_test]
1146
+ fn v4_and_git_url_encoded_rev() {
1147
+ v4_and_git_url_encoded("rev", create_tag)
1148
+ }
0 commit comments