61 "Total files %d | Changed %d | Failed %d",
87 if (id->library_weak_reference !=
nullptr &&
91 id->library_weak_reference->library_filepath,
92 sizeof(id->library_weak_reference->library_filepath));
96 if (embedded_node_tree !=
nullptr) {
103 if (id_type ==
nullptr || id_type->
foreach_path ==
nullptr) {
130 const char *path_src;
133 if (absolute_base_path) {
136 path_src = path_src_buf;
145 if (bpath_data->
callback_function(bpath_data, path_dst,
sizeof(path_dst), path_src)) {
156 size_t path_dir_maxncpy,
158 size_t path_file_maxncpy)
165 BLI_path_join(path_src,
sizeof(path_src), path_dir, path_file);
170 if (absolute_base_path) {
175 bpath_data, path_dst,
sizeof(path_dst), (
const char *)path_src))
190 const char *path_src;
193 if (absolute_base_path) {
196 path_src = path_src_buf;
202 if (bpath_data->
callback_function(bpath_data, path_dst,
sizeof(path_dst), path_src)) {
221 const char *path_src)
231 "Path '%s' not found, from linked data-block '%s' (from library '%s')",
239 "Path '%s' not found, from local data-block '%s'",
246 reports,
RPT_WARNING,
"Path '%s' not found (no known owner data-block)", path_src);
256 path_data.
bmain = bmain;
260 path_data.user_data = reports;
274#define MAX_DIR_RECURSE 16
275#define FILESIZE_INVALID_DIRECTORY -1
293 const char *filename_src,
296 int *r_recurse_depth)
306 dir =
opendir(search_directory);
308 if (dir ==
nullptr) {
321 BLI_path_join(path,
sizeof(path), search_directory, de->d_name);
323 if (
BLI_stat(path, &status) == -1) {
324 CLOG_WARN(&
LOG,
"Cannot get file status (`stat()`) of '%s'", path);
330 size = status.st_size;
331 if ((size > 0) && (size > *r_filesize)) {
338 else if (
S_ISDIR(status.st_mode)) {
340 (*r_recurse_depth)++;
342 path, filename_src, r_filepath_new, r_filesize, r_recurse_depth);
343 (*r_recurse_depth)--;
361 size_t path_dst_maxncpy,
362 const char *path_src)
368 int recurse_depth = 0;
371 if (!data->find_all &&
BLI_exists(path_src)) {
375 filepath_new[0] =
'\0';
378 data->searchdir,
BLI_path_basename(path_src), filepath_new, &filesize, &recurse_depth);
383 "Could not open the directory '%s'",
387 if (is_found ==
false) {
390 "Could not find '%s' in '%s'",
400 BLI_strncpy(path_dst, filepath_new, path_dst_maxncpy);
405 const char *searchpath,
414 data.reports = reports;
415 data.searchdir = searchpath;
416 data.find_all = find_all;
419 path_data.
bmain = bmain;
422 path_data.user_data = &
data;
426#undef MAX_DIR_RECURSE
427#undef FILESIZE_INVALID_DIRECTORY
445 size_t path_dst_maxncpy,
446 const char *path_src)
450 data->summary.count_total++;
461 data->summary.count_failed++;
471 data->summary.count_changed++;
476 const char *basedir_src,
477 const char *basedir_dst,
487 data.basedir_src = basedir_src;
488 data.basedir_dst = basedir_dst;
489 data.reports = reports;
492 path_data.
bmain = bmain;
495 path_data.user_data = &
data;
499 *r_summary = data.summary;
518 size_t path_dst_maxncpy,
519 const char *path_src)
523 data->summary.count_total++;
538 "Path '%s' cannot be made relative for %s '%s'",
542 data->summary.count_failed++;
546 BLI_strncpy(path_dst, path_test, path_dst_maxncpy);
547 data->summary.count_changed++;
553 size_t path_dst_maxncpy,
554 const char *path_src)
558 data->summary.count_total++;
572 "Path '%s' cannot be made absolute for %s '%s'",
576 data->summary.count_failed++;
580 BLI_strncpy(path_dst, path_test, path_dst_maxncpy);
581 data->summary.count_changed++;
595 if (basedir[0] ==
'\0') {
600 data.basedir = basedir;
601 data.reports = reports;
604 path_data.
bmain = bmain;
605 path_data.callback_function = callback_function;
607 path_data.user_data = &
data;
611 *r_summary = data.summary;
649 const char *path_src)
652 size_t path_size = strlen(path_src) + 1;
658 char *filepath = path_store->
filepath;
660 memcpy(filepath, path_src, path_size);
667 size_t path_dst_maxncpy,
668 const char *path_src)
677 const char *filepath = path_store->
filepath;
678 bool is_path_changed =
false;
680 if (!
STREQ(path_src, filepath)) {
682 is_path_changed =
true;
686 return is_path_changed;
694 path_data.
bmain = bmain;
696 path_data.flag =
flag;
697 path_data.user_data = path_list;
708 path_data.
bmain = bmain;
710 path_data.flag =
flag;
711 path_data.user_data = path_list;
bool(*)(BPathForeachPathData *bpath_data, char *path_dst, size_t path_dst_maxncpy, const char *path_src) BPathForeachPathFunctionCallback
@ BKE_BPATH_TRAVERSE_SKIP_WEAK_REFERENCES
@ BKE_BPATH_FOREACH_PATH_SKIP_LINKED
@ BKE_BPATH_FOREACH_PATH_ABSOLUTE
@ BKE_BPATH_FOREACH_PATH_SKIP_PACKED
@ BKE_BPATH_FOREACH_PATH_SKIP_MULTIFILE
@ BKE_BPATH_FOREACH_PATH_RESOLVE_TOKEN
@ BKE_BPATH_FOREACH_PATH_RELOAD_EDITED
const IDTypeInfo * BKE_idtype_get_info_from_id(const ID *id)
#define FOREACH_MAIN_ID_END
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
File and directory operations.
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_stat(const char *path, BLI_stat_t *buffer) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
int BLI_path_normalize(char *path) ATTR_NONNULL(1)
#define BLI_path_join(...)
#define FILENAME_IS_CURRPAR(_n)
void BLI_path_split_dir_file(const char *filepath, char *dir, size_t dir_maxncpy, char *file, size_t file_maxncpy) ATTR_NONNULL(1
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
#define STRNCPY(dst, src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
Compatibility-like things for windows.
struct dirent * readdir(DIR *dp)
DIR * opendir(const char *path)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
#define ID_IS_LINKED(_id)
#define ID_BLEND_PATH(_bmain, _id)
Read Guarded memory(de)allocation.
static bool bpath_list_restore(BPathForeachPathData *bpath_data, char *path_dst, size_t path_dst_maxncpy, const char *path_src)
static bool missing_files_find_foreach_path_cb(BPathForeachPathData *bpath_data, char *path_dst, size_t path_dst_maxncpy, const char *path_src)
static bool relative_convert_foreach_path_cb(BPathForeachPathData *bpath_data, char *path_dst, size_t path_dst_maxncpy, const char *path_src)
bool BKE_bpath_foreach_path_dirfile_fixed_process(BPathForeachPathData *bpath_data, char *path_dir, size_t path_dir_maxncpy, char *path_file, size_t path_file_maxncpy)
static void bpath_absolute_relative_convert(Main *bmain, const char *basedir, ReportList *reports, BPathForeachPathFunctionCallback callback_function, BPathSummary *r_summary)
void * BKE_bpath_list_backup(Main *bmain, const eBPathForeachFlag flag)
void BKE_bpath_summary_report(const BPathSummary &summary, ReportList *reports)
bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, char *path, size_t path_maxncpy)
void BKE_bpath_relative_rebase(Main *bmain, const char *basedir_src, const char *basedir_dst, ReportList *reports, BPathSummary *r_summary)
void BKE_bpath_list_restore(Main *bmain, const eBPathForeachFlag flag, void *path_list_handle)
void BKE_bpath_foreach_path_id(BPathForeachPathData *bpath_data, ID *id)
void BKE_bpath_relative_convert(Main *bmain, const char *basedir, ReportList *reports, BPathSummary *r_summary)
static bool absolute_convert_foreach_path_cb(BPathForeachPathData *bpath_data, char *path_dst, size_t path_dst_maxncpy, const char *path_src)
static bool relative_rebase_foreach_path_cb(BPathForeachPathData *bpath_data, char *path_dst, size_t path_dst_maxncpy, const char *path_src)
void BKE_bpath_list_free(void *path_list_handle)
static bool check_missing_files_foreach_path_cb(BPathForeachPathData *bpath_data, char *, size_t, const char *path_src)
#define FILESIZE_INVALID_DIRECTORY
void BKE_bpath_missing_files_check(Main *bmain, ReportList *reports)
bool BKE_bpath_foreach_path_allocated_process(BPathForeachPathData *bpath_data, char **path)
static bool missing_files_find__recursive(const char *search_directory, const char *filename_src, char r_filepath_new[FILE_MAX], int64_t *r_filesize, int *r_recurse_depth)
void BKE_bpath_foreach_path_main(BPathForeachPathData *bpath_data)
static bool bpath_list_append(BPathForeachPathData *bpath_data, char *, size_t, const char *path_src)
void BKE_bpath_absolute_convert(Main *bmain, const char *basedir, ReportList *reports, BPathSummary *r_summary)
void BKE_bpath_missing_files_find(Main *bmain, const char *searchpath, ReportList *reports, const bool find_all)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
std::string id_name(void *id)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
bNodeTree * node_tree_from_id(ID *id)
const char * absolute_base_path
BPathForeachPathFunctionCallback callback_function
IDTypeForeachPathFunction foreach_path
struct Library_Runtime runtime