File reproducible.patch of Package blender-31

commit 2115054bb8a41bb7ddffce32e396d9ffced300b1
Author: Bernhard M. Wiedemann <bwiedemann@suse.de>
Date:   Sat Sep 7 06:19:50 2019 +0200

    Sort list of .dat files
    
    Sort list of .dat files
    in .png generation to make builds reproducible.
    See https://reproducible-builds.org/ for why this matters.
    
    Note: scandir is only available on POSIX-compliant platforms (Linux,
    BSD, MacOSX, cygwin) - so others would need some compat layer.
    
    Reviewers: mont29
    
    Differential Revision: https://developer.blender.org/D5858

Index: blender-3.0.0/source/blender/datatoc/datatoc_icon.c
===================================================================
--- blender-3.0.0.orig/source/blender/datatoc/datatoc_icon.c
+++ blender-3.0.0/source/blender/datatoc/datatoc_icon.c
@@ -402,7 +402,8 @@ static bool icon_merge(struct IconMergeC
 static bool icondir_to_png(const char *path_src, const char *file_dst)
 {
   /* Takes a path full of 'dat' files and writes out */
-  DIR *dir;
+  struct dirent **namelist;
+  int dirn;
   const struct dirent *fname;
   char filepath[1024];
   char *filename;
@@ -417,8 +418,8 @@ static bool icondir_to_png(const char *p
   icon_merge_context_init(&context);
 
   errno = 0;
-  dir = opendir(path_src);
-  if (dir == NULL) {
+  dirn = scandir(path_src, &namelist, NULL, alphasort);
+  if (dirn == -1) {
     printf(
         "%s: failed to dir '%s', (%s)\n", __func__, path_src, errno ? strerror(errno) : "unknown");
     return false;
@@ -428,7 +429,8 @@ static bool icondir_to_png(const char *p
   path_str_len = path_ensure_slash(filepath);
   filename = &filepath[path_str_len];
 
-  while ((fname = readdir(dir)) != NULL) {
+  while (dirn--) {
+    fname = namelist[dirn];
     if (path_test_extension(fname->d_name, ".dat")) {
 
       strcpy(filename, fname->d_name);
@@ -440,11 +442,12 @@ static bool icondir_to_png(const char *p
         fail++;
       }
     }
+    free(fname);
   }
 
   icon_merge_context_free(&context);
 
-  closedir(dir);
+  free(namelist);
 
   if (found == 0) {
     printf("%s: dir '%s' has no icons\n", __func__, path_src);
Index: blender-3.0.0/source/blender/datatoc/datatoc_icon.py
===================================================================
--- blender-3.0.0.orig/source/blender/datatoc/datatoc_icon.py
+++ blender-3.0.0/source/blender/datatoc/datatoc_icon.py
@@ -113,7 +113,7 @@ def icondir_to_png(path_src, file_dst):
     import os
     import array
 
-    files = [os.path.join(path_src, f) for f in os.listdir(path_src) if f.endswith(".dat")]
+    files = [os.path.join(path_src, f) for f in sorted(os.listdir(path_src)) if f.endswith(".dat")]
 
     # First check if we need to bother.
     if os.path.exists(file_dst):
openSUSE Build Service is sponsored by