@@ -19,8 +19,8 @@ fn strip_removes_unspecified_metadata() {
1919 let path = entry. header ( ) . path ( ) . to_string ( ) ;
2020 let meta = entry. metadata ( ) ;
2121 assert ! (
22- meta. permission ( ) . is_some( ) && meta. modified( ) . is_some( ) ,
23- "entry {path} should have both permission and timestamp before strip"
22+ meta. permission_mode ( ) . is_some( ) && meta. modified( ) . is_some( ) ,
23+ "entry {path} should have both permission mode and timestamp before strip"
2424 ) ;
2525 pre_timestamps. insert ( path, meta. modified ( ) ) ;
2626 } )
@@ -76,31 +76,44 @@ fn strip_removes_unspecified_metadata() {
7676 ) ;
7777}
7878
79- /// Precondition: An fPRM-only archive carries ownership metadata.
79+ /// Precondition: An archive carries ownership metadata as owner facets .
8080/// Action: Run `pna strip --keep-permission`.
81- /// Expectation: Ownership is preserved as owner-facet chunks (rescued from fPRM) ; the legacy fPRM chunk is not emitted.
81+ /// Expectation: Ownership is preserved as owner-facet chunks; the legacy fPRM chunk is not emitted.
8282#[ test]
8383#[ allow( deprecated) ]
84- fn strip_keep_permission_rescues_fprm_to_owner_facet ( ) {
84+ fn strip_keep_permission_preserves_owner_facets ( ) {
85+ struct OwnerFacets {
86+ uid : Option < u64 > ,
87+ gid : Option < u64 > ,
88+ uname : Option < String > ,
89+ gname : Option < String > ,
90+ mode : Option < u16 > ,
91+ }
92+
8593 setup ( ) ;
8694 TestResources :: extract_in ( "zstd_keep_all.pna" , "strip_keep_perm/" ) . unwrap ( ) ;
8795
88- let mut pre: BTreeMap < String , ( u64 , u64 , String , String , u16 ) > = BTreeMap :: new ( ) ;
96+ let mut pre: BTreeMap < String , OwnerFacets > = BTreeMap :: new ( ) ;
8997 archive:: for_each_entry ( "strip_keep_perm/zstd_keep_all.pna" , |entry| {
9098 let path = entry. header ( ) . path ( ) . to_string ( ) ;
91- let p = entry
92- . metadata ( )
93- . permission ( )
94- . expect ( "fixture entry should carry fPRM permission" ) ;
99+ let meta = entry. metadata ( ) ;
100+ assert ! (
101+ meta. permission( ) . is_none( ) ,
102+ "fixture entry should not carry fPRM permission for {path}"
103+ ) ;
104+ assert ! (
105+ meta. permission_mode( ) . is_some( ) ,
106+ "fixture entry should carry owner-facet permission mode for {path}"
107+ ) ;
95108 pre. insert (
96109 path,
97- (
98- p . uid ( ) ,
99- p . gid ( ) ,
100- p . uname ( ) . to_string ( ) ,
101- p . gname ( ) . to_string ( ) ,
102- p . permissions ( ) ,
103- ) ,
110+ OwnerFacets {
111+ uid : meta . owner_uid ( ) . map ( |v| v . get ( ) ) ,
112+ gid : meta . owner_gid ( ) . map ( |v| v . get ( ) ) ,
113+ uname : meta . owner_user_name ( ) . map ( |v| v . as_str ( ) . to_owned ( ) ) ,
114+ gname : meta . owner_group_name ( ) . map ( |v| v . as_str ( ) . to_owned ( ) ) ,
115+ mode : meta . permission_mode ( ) . map ( |v| v . get ( ) ) ,
116+ } ,
104117 ) ;
105118 } )
106119 . unwrap ( ) ;
@@ -123,40 +136,36 @@ fn strip_keep_permission_rescues_fprm_to_owner_facet() {
123136 post_count += 1 ;
124137 let path = entry. header ( ) . path ( ) . to_string ( ) ;
125138 let meta = entry. metadata ( ) ;
126- let ( uid , gid , uname , gname , mode ) = pre
139+ let expected = pre
127140 . get ( & path)
128141 . unwrap_or_else ( || panic ! ( "unexpected entry after strip: {path}" ) ) ;
129142 assert ! (
130143 meta. permission( ) . is_none( ) ,
131144 "fPRM must not be emitted after strip --keep-permission for {path}"
132145 ) ;
133- assert_eq ! ( meta. owner_uid( ) . map( |v| v. get( ) ) , Some ( * uid) , "uid {path}" ) ;
134- assert_eq ! ( meta. owner_gid( ) . map( |v| v. get( ) ) , Some ( * gid) , "gid {path}" ) ;
135- let expected_uname = if uname. is_empty ( ) {
136- None
137- } else {
138- Some ( uname. as_str ( ) )
139- } ;
140- let expected_gname = if gname. is_empty ( ) {
141- None
142- } else {
143- Some ( gname. as_str ( ) )
144- } ;
146+ assert_eq ! (
147+ meta. owner_uid( ) . map( |v| v. get( ) ) ,
148+ expected. uid,
149+ "uid {path}"
150+ ) ;
151+ assert_eq ! (
152+ meta. owner_gid( ) . map( |v| v. get( ) ) ,
153+ expected. gid,
154+ "gid {path}"
155+ ) ;
145156 assert_eq ! (
146157 meta. owner_user_name( ) . map( |v| v. as_str( ) ) ,
147- expected_uname ,
158+ expected . uname . as_deref ( ) ,
148159 "uname {path}"
149160 ) ;
150161 assert_eq ! (
151162 meta. owner_group_name( ) . map( |v| v. as_str( ) ) ,
152- expected_gname ,
163+ expected . gname . as_deref ( ) ,
153164 "gname {path}"
154165 ) ;
155- // `PermissionMode::from` masks reserved bits outside `0o7777`
156- // (file-type bits in the legacy fPRM `st_mode`) to 0 on construction.
157166 assert_eq ! (
158167 meta. permission_mode( ) . map( |v| v. get( ) ) ,
159- Some ( * mode & 0o7777 ) ,
168+ expected . mode,
160169 "mode {path}"
161170 ) ;
162171 } )
0 commit comments