@@ -860,64 +860,41 @@ def _meson_version(self) -> str:
860
860
861
861
def sdist (self , directory : Path ) -> pathlib .Path :
862
862
"""Generates a sdist (source distribution) in the specified directory."""
863
- # generate meson dist file
863
+ # Generate meson dist file.
864
864
self ._run (self ._meson + ['dist' , '--allow-dirty' , '--no-tests' , '--formats' , 'gztar' , * self ._meson_args ['dist' ]])
865
865
866
- # move meson dist file to output path
867
866
dist_name = f'{ self ._metadata .distribution_name } -{ self ._metadata .version } '
868
867
meson_dist_name = f'{ self ._meson_name } -{ self ._meson_version } '
869
868
meson_dist_path = pathlib .Path (self ._build_dir , 'meson-dist' , f'{ meson_dist_name } .tar.gz' )
870
- sdist = pathlib .Path (directory , f'{ dist_name } .tar.gz' )
869
+ sdist_path = pathlib .Path (directory , f'{ dist_name } .tar.gz' )
871
870
872
- with tarfile .open (meson_dist_path , 'r:gz' ) as meson_dist , mesonpy ._util .create_targz (sdist ) as tar :
871
+ with tarfile .open (meson_dist_path , 'r:gz' ) as meson_dist , mesonpy ._util .create_targz (sdist_path ) as sdist :
873
872
for member in meson_dist .getmembers ():
874
- # calculate the file path in the source directory
875
- assert member .name , member .name
876
- member_parts = member .name .split ('/' )
877
- if len (member_parts ) <= 1 :
878
- continue
879
- path = self ._source_dir .joinpath (* member_parts [1 :])
873
+ if member .isfile ():
874
+ file = meson_dist .extractfile (member .name )
880
875
881
- if not path .exists () and member .isfile ():
882
- # File doesn't exists on the source directory but exists on
883
- # the Meson dist, so it is generated file, which we need to
884
- # include.
885
- # See https://mesonbuild.com/Reference-manual_builtin_meson.html#mesonadd_dist_script
876
+ # Rewrite the path to match the sdist distribution name.
877
+ stem = member .name .split ('/' , 1 )[1 ]
878
+ member .name = '/' .join ((dist_name , stem ))
886
879
887
- # MESON_DIST_ROOT could have a different base name
888
- # than the actual sdist basename, so we need to rename here
889
- file = meson_dist .extractfile (member .name )
890
- member .name = str (pathlib .Path (dist_name , * member_parts [1 :]).as_posix ())
891
- tar .addfile (member , file )
892
- continue
880
+ # Reset owner and group to root:root. This mimics what
881
+ # 'git archive' does and makes the sdist reproducible upon
882
+ # being built by different users.
883
+ member .uname = member .gname = 'root'
884
+ member .uid = member .gid = 0
893
885
894
- if not path .is_file ():
895
- continue
886
+ sdist .addfile (member , file )
896
887
897
- info = tarfile .TarInfo (member .name )
898
- file_stat = os .stat (path )
899
- info .mtime = member .mtime
900
- info .size = file_stat .st_size
901
- info .mode = int (oct (file_stat .st_mode )[- 3 :], 8 )
902
-
903
- # rewrite the path if necessary, to match the sdist distribution name
904
- if dist_name != meson_dist_name :
905
- info .name = pathlib .Path (
906
- dist_name ,
907
- path .relative_to (self ._source_dir )
908
- ).as_posix ()
909
-
910
- with path .open ('rb' ) as f :
911
- tar .addfile (info , fileobj = f )
912
-
913
- # add PKG-INFO to dist file to make it a sdist
914
- pkginfo_info = tarfile .TarInfo (f'{ dist_name } /PKG-INFO' )
915
- pkginfo_info .mtime = time .time () # type: ignore[assignment]
888
+ # Add 'PKG-INFO'.
889
+ member = tarfile .TarInfo (f'{ dist_name } /PKG-INFO' )
890
+ member .uid = member .gid = 0
891
+ member .uname = member .gname = 'root'
892
+ member .mtime = time .time ()
916
893
metadata = bytes (self ._metadata .as_rfc822 ())
917
- pkginfo_info .size = len (metadata )
918
- tar .addfile (pkginfo_info , fileobj = io .BytesIO (metadata ))
894
+ member .size = len (metadata )
895
+ sdist .addfile (member , io .BytesIO (metadata ))
919
896
920
- return sdist
897
+ return sdist_path
921
898
922
899
def wheel (self , directory : Path ) -> pathlib .Path :
923
900
"""Generates a wheel in the specified directory."""
0 commit comments