@@ -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