@@ -6,13 +6,16 @@ use std::io;
66use std:: io:: prelude:: * ;
77use std:: sync:: Arc ;
88
9- use self :: diesel:: prelude:: * ;
109use chrono:: Utc ;
1110use conduit:: { Handler , Method } ;
1211use diesel:: update;
12+ use flate2:: Compression ;
13+ use flate2:: write:: GzEncoder ;
1314use git2;
15+ use self :: diesel:: prelude:: * ;
1416use semver;
1517use serde_json;
18+ use tar;
1619
1720use cargo_registry:: git;
1821use cargo_registry:: models:: krate:: MAX_NAME_LENGTH ;
@@ -2235,3 +2238,25 @@ fn test_cargo_invite_owners() {
22352238// assert_eq!(json.krate.name, "foo_new");
22362239// assert_eq!(json.krate.max_version, "1.0.0");
22372240// }
2241+
2242+ #[ test]
2243+ fn new_krate_hard_links ( ) {
2244+ let ( _b, app, middle) = :: app ( ) ;
2245+ let mut req = :: new_req ( Arc :: clone ( & app) , "foo" , "1.1.0" ) ;
2246+ :: sign_in ( & mut req, & app) ;
2247+
2248+ let mut tarball = Vec :: new ( ) ;
2249+ {
2250+ let mut ar = tar:: Builder :: new ( GzEncoder :: new ( & mut tarball, Compression :: default ( ) ) ) ;
2251+ let mut header = tar:: Header :: new_gnu ( ) ;
2252+ t ! ( header. set_path( "foo-1.1.0/bar" ) ) ;
2253+ header. set_size ( 0 ) ;
2254+ header. set_cksum ( ) ;
2255+ header. set_entry_type ( tar:: EntryType :: hard_link ( ) ) ;
2256+ t ! ( header. set_link_name( "foo-1.1.0/another" ) ) ;
2257+ t ! ( ar. append( & header, & [ ] [ ..] ) ) ;
2258+ t ! ( ar. finish( ) ) ;
2259+ }
2260+ let body = :: new_crate_to_body_with_tarball ( & new_crate ( "foo" ) , & tarball) ;
2261+ bad_resp ! ( middle. call( req. with_body( & body) ) ) ;
2262+ }
0 commit comments