commit 2115054bb8a41bb7ddffce32e396d9ffced300b1 Author: Bernhard M. Wiedemann 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-2.91.0/source/blender/datatoc/datatoc_icon.c =================================================================== --- blender-2.91.0.orig/source/blender/datatoc/datatoc_icon.c +++ blender-2.91.0/source/blender/datatoc/datatoc_icon.c @@ -308,7 +308,8 @@ static bool icon_merge(const char *file_ 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; @@ -319,8 +320,8 @@ static bool icondir_to_png(const char *p unsigned int canvas_w = 0, canvas_h = 0; 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; @@ -330,7 +331,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); @@ -342,9 +344,10 @@ 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-2.91.0/source/blender/datatoc/datatoc_icon.py =================================================================== --- blender-2.91.0.orig/source/blender/datatoc/datatoc_icon.py +++ blender-2.91.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):