Commit: 8f4d6f62ea02de2c5589087c2bd9928874844fcf
Author: Bastien Montagne
Date:   Sat Jan 3 17:07:16 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rB8f4d6f62ea02de2c5589087c2bd9928874844fcf

Merge branch 'master' into asset-experiments

Conflicts:
        source/blender/blenkernel/BKE_camera.h
        source/blender/blenkernel/intern/camera.c
        source/blender/blenlib/BLI_fileops.h
        source/blender/blenlib/intern/storage.c
        source/blender/editors/space_file/filelist.c
        source/blender/makesrna/intern/rna_object_api.c
        tests/gtests/blenlib/BLI_path_util_test.cc

===================================================================



===================================================================

diff --cc source/blender/editors/space_file/filelist.c
index 65f8a69,abfa1ed..828d85b
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@@ -675,20 -565,14 +675,20 @@@ void filelist_setfilter_options(FileLis
        if ((filelist->filter_data.hide_dot != hide_dot) ||
            (filelist->filter_data.hide_parent != hide_parent) ||
            (filelist->filter_data.filter != filter) ||
 -          (!STREQ(filelist->filter_data.filter_glob, filter_glob)))
 +          (filelist->filter_data.filter_id != filter_id) ||
 +          !STREQ(filelist->filter_data.filter_glob, filter_glob) ||
-           
(BLI_fnmatch_strcmp_ignore_endswildcards(filelist->filter_data.filter_search, 
filter_search) != 0))
++          (BLI_strcmp_ignore_pad(filelist->filter_data.filter_search, 
filter_search, '*') != 0))
        {
                filelist->filter_data.hide_dot = hide_dot;
                filelist->filter_data.hide_parent = hide_parent;
  
                filelist->filter_data.filter = filter;
 +              filelist->filter_data.filter_id = filter_id;
                BLI_strncpy(filelist->filter_data.filter_glob, filter_glob, 
sizeof(filelist->filter_data.filter_glob));
-               
BLI_fnmatch_strncpy_add_endswildcards(filelist->filter_data.filter_search, 
filter_search,
-                                                     
sizeof(filelist->filter_data.filter_search));
++              BLI_strncpy_ensure_pad(filelist->filter_data.filter_search, 
filter_search, '*',
++                                     
sizeof(filelist->filter_data.filter_search));
  
 +              /* And now, free filtered data so that we now we have to filter 
again. */
                filelist_filter_clear(filelist);
        }
  }
@@@ -968,23 -722,6 +968,23 @@@ FileList *filelist_new(short type
        return p;
  }
  
 +void filelist_clear(struct FileList *filelist)
 +{
 +      if (!filelist) {
 +              return;
 +      }
 +
 +      if (filelist->fidx) {
 +              MEM_freeN(filelist->fidx);
 +              filelist->fidx = NULL;
 +      }
 +
-       BLI_free_filelist(filelist->filelist, filelist->numfiles);
++      BLI_filelist_free(filelist->filelist, filelist->numfiles, NULL);
 +      filelist->numfiles = 0;
 +      filelist->filelist = NULL;
 +      filelist->numfiltered = 0;
 +}
 +
  void filelist_free(struct FileList *filelist)
  {
        if (!filelist) {
@@@ -999,9 -736,7 +999,9 @@@
        filelist->need_sorting = false;
        filelist->sort = FILE_SORT_NONE;
  
 +      filelist->need_thumbnails = false;
 +
-       BLI_free_filelist(filelist->filelist, filelist->numfiles);
+       BLI_filelist_free(filelist->filelist, filelist->numfiles, NULL);
        filelist->numfiles = 0;
        filelist->filelist = NULL;
  }
@@@ -1714,291 -1325,6 +1714,291 @@@ static void filelist_readjob_main_rec(s
                }
        }
  }
 +#endif
 +
 +static void filelist_readjob_dir_lib_rec(
 +        const bool do_lib, const char *main_name,
 +        FileList *filelist, int *filelist_buffsize, const char *dir, const 
char *filter_glob, const int recursion_level,
 +        short *stop, short *do_update, float *progress, int *done_files, 
ThreadMutex *lock)
 +{
 +      /* only used if recursing, will contain all non-immediate children 
then. */
 +      struct direntry *file, *files = NULL;
 +      bool is_lib = do_lib;
 +      int num_files = 0;
 +      int i;
 +
 +      if (!filelist) {
 +              return;
 +      }
 +
 +      if (do_lib) {
 +              filelist_readjob_list_lib(dir, &files, &num_files);
 +
 +              if (!files) {
 +                      is_lib = false;
-                       num_files = BLI_dir_contents(dir, &files);
++                      num_files = BLI_filelist_dir_contents(dir, &files);
 +              }
 +      }
 +      else {
-               num_files = BLI_dir_contents(dir, &files);
++              num_files = BLI_filelist_dir_contents(dir, &files);
 +      }
 +
 +      if (!files) {
 +              return;
 +      }
 +
 +      /* We only set filtypes for our own level, sub ones will be set by 
subcalls. */
 +      filelist_setfiletypes(dir, files, num_files, filter_glob);
 +
 +      if (do_lib) {
 +              /* Promote blend files from mere file status to prestigious 
directory one! */
 +              for (i = 0, file = files; i < num_files; i++, file++) {
 +                      if (BLO_has_bfile_extension(file->relname)) {
 +                              char name[FILE_MAX];
 +
 +                              BLI_join_dirfile(name, sizeof(name), dir, 
file->relname);
 +
 +                              /* prevent current file being used as 
acceptable dir */
 +                              if (BLI_path_cmp(main_name, name) != 0) {
 +                                      file->type &= ~S_IFMT;
 +                                      file->type |= S_IFDIR;
 +                              }
 +                      }
 +              }
 +      }
 +
 +      BLI_mutex_lock(lock);
 +
 +      filelist_readjob_merge_sublist(&filelist->filelist, filelist_buffsize, 
&filelist->numfiles, filelist->dir,
 +                                     dir, files, num_files, recursion_level 
!= 0);
 +
 +      (*done_files)++;
 +      *progress = (float)(*done_files) / filelist->numfiles;
 +
 +      //~ printf("%f (%d / %d)\n", *progress, *done_files, 
filelist->numfiles);
 +
 +      BLI_mutex_unlock(lock);
 +
 +      *do_update = true;
 +
 +      /* in case it's a lib we don't care anymore about max recursion 
level... */
 +      if (!*stop && filelist->use_recursion && ((do_lib && is_lib) || 
(recursion_level < FILELIST_MAX_RECURSION))) {
 +              for (i = 0, file = files; i < num_files && !*stop; i++, file++) 
{
 +                      char subdir[FILE_MAX];
 +
 +                      if (FILENAME_IS_BREADCRUMBS(file->relname)) {
 +                              /* do not increase done_files here, we 
completly ignore those. */
 +                              continue;
 +                      }
 +                      else if ((file->type & S_IFDIR) == 0) {
 +                              (*done_files)++;
 +                              continue;
 +                      }
 +
 +                      BLI_join_dirfile(subdir, sizeof(subdir), dir, 
file->relname);
 +                      BLI_cleanup_dir(main_name, subdir);
 +                      filelist_readjob_dir_lib_rec(do_lib, main_name,
 +                                                   filelist, 
filelist_buffsize, subdir, filter_glob, recursion_level + 1,
 +                                                   stop, do_update, progress, 
done_files, lock);
 +              }
 +      }
-       BLI_free_filelist(files, num_files);
++      BLI_filelist_free(files, num_files, NULL);
 +}
 +
 +static void filelist_readjob_dir(
 +        FileList *filelist, const char *main_name, short *stop, short 
*do_update, float *progress, ThreadMutex *lock)
 +{
 +      char dir[FILE_MAX];
 +      char filter_glob[64];  /* TODO should be define! */
 +      int filelist_buffsize = 0;
 +      int done_files = 0;
 +
 +      BLI_assert(filelist->fidx == NULL);
 +      BLI_assert(filelist->filelist == NULL);
 +
 +      BLI_mutex_lock(lock);
 +
 +      BLI_strncpy(dir, filelist->dir, sizeof(dir));
 +      BLI_strncpy(filter_glob, filelist->filter_data.filter_glob, 
sizeof(filter_glob));
 +
 +      BLI_mutex_unlock(lock);
 +
 +      filelist_readjob_dir_lib_rec(false, main_name, filelist, 
&filelist_buffsize, dir, filter_glob, 0,
 +                                   stop, do_update, progress, &done_files, 
lock);
 +}
 +
 +static void filelist_readjob_lib(
 +        FileList *filelist, const char *main_name, short *stop, short 
*do_update, float *progress, ThreadMutex *lock)
 +{
 +      char dir[FILE_MAX];
 +      char filter_glob[64];  /* TODO should be define! */
 +      int filelist_buffsize = 0;
 +      int done_files = 0;
 +
 +      BLI_assert(filelist->fidx == NULL);
 +      BLI_assert(filelist->filelist == NULL);
 +
 +      BLI_mutex_lock(lock);
 +
 +      BLI_strncpy(dir, filelist->dir, sizeof(dir));
 +      BLI_strncpy(filter_glob, filelist->filter_data.filter_glob, 
sizeof(filter_glob));
 +
 +      BLI_mutex_unlock(lock);
 +
 +      BLI_cleanup_dir(main_name, dir);
 +
 +      filelist_readjob_dir_lib_rec(true, main_name, filelist, 
&filelist_buffsize, dir, filter_glob, 0,
 +                                   stop, do_update, progress, &done_files, 
lock);
 +}
 +
 +static void filelist_readjob_main(
 +        FileList *filelist, const char *main_name, short *stop, short 
*do_update, float *progress, ThreadMutex *lock)
 +{
 +      BLI_mutex_lock(lock);
 +
 +      /* TODO! */
 +      filelist_readjob_dir(filelist, main_name, stop, do_update, progress, 
lock);
 +
 +      BLI_mutex_unlock(lock);
 +}
 +
 +
 +typedef struct FileListReadJob {
 +      ThreadMutex lock;
 +      char main_name[FILE_MAX];
 +      struct FileList *filelist;
 +      struct FileList *tmp_filelist;
 +      //~ ReportList reports;
 +} FileListReadJob;
 +
 +static void filelist_readjob_startjob(void *flrjv, short *stop, short 
*do_update, float *progress)
 +{
 +      FileListReadJob *flrj = flrjv;
 +
 +      printf("START filelist reading (%d files, main thread: %d)\n", 
flrj->filelist->numfiles, BLI_thread_is_main());
 +
 +      BLI_mutex_lock(&flrj->lock);
 +
 +      BLI_assert((flrj->tmp_filelist == NULL) && flrj->filelist);
 +
 +      flrj->tmp_filelist = MEM_dupallocN(flrj->filelist);
 +
 +      BLI_mutex_unlock(&flrj->lock);
 +
 +      flrj->tmp_filelist->filelist = NULL;
 +      flrj->tmp_filelist->fidx = NULL;
 +      flrj->tmp_filelist->numfiles = 0;
 +      flrj->tmp_filelist->fidx = 0;
 +      flrj->tmp_filelist->libfiledata = NULL;
 +
 +      flrj->tmp_filelist->read_jobf(flrj->tmp_filelist, flrj->main_name, 
stop, do_update, progress, &flrj->lock);
 +
 +      printf("END filelist reading (%d files, STOPPED: %d, DO_UPDATE: %d)\n", 
flrj->filelist->numfiles, *stop, *do_update);
 +}
 +
 +static void filelist_readjob_update(void *flrjv)
 +{
 +      FileListReadJob *flrj = flrjv;
 +      struct direntry *new_entries = NULL;
 +      int num_new_entries = 0;
 +
 +      BLI_mutex_lock(&flrj->lock);
 +
 +      if (flrj->tmp_filelist->numfiles != flrj->filelist->numfiles) {
 +              num_new_entries = flrj->tmp_filelist->numfiles;
 +              /* This way we are sure we won't share any mem with background 
job! */
 +              /* Note direntry->poin is not handled here, should not matter 
though currently. */
-               BLI_duplicate_filelist(&new_entries, 
flrj->tmp_filelist->filelist, num_new_entries, NULL);
++              BLI_filelist_duplicate(&new_entries, 
flrj->tmp_filelist->filelist, num_new_entries, NULL);
 +      }
 +
 +      BLI_mutex_unlock(&flrj->lock);
 +
 +      if (new_entries) {
 +              if (flrj->filelist->filelist) {
-                       BLI_free_filelist(flrj->filelist->filelist, 
flrj->filelist->numfiles);
++                      BLI_filelist_free(flrj->filelist->filelist, 
flrj->filelist->numfiles, NULL);
 +              }
 +              flrj->filelist->filelist = new_entries;
 +              flrj->filelist->numfiles = num_new_entries;
 +              if (flrj->filelist->fidx) {
 +                      MEM_freeN(flrj->filelist->fidx);
 +                      flrj->filelist->fidx = NULL;
 +                      flrj->filelist->numfiltered = 0;
 +              }
 +
 +              flrj->filelist->need_sorting = true;
 +              flrj->filelist->force_refresh = true;
 +              /* Better be explicit here, since we overwrite 
filelist->filelist on each run of this update func,
 +               * it would be stupid to start thumbnail job! */
 +              flrj->filelist->need_thumbnails = false;
 +      }
 +}
 +
 +static void filelist_readjob_endjob(void *flrjv)
 +{
 +      FileListReadJob *flrj = flrjv;
 +
 +      flrj->filelist->filelist_pending = false;
 +      flrj->filelist->filelist_ready = true;
 +      /* Now we can update

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to