Skip to content

Commit

Permalink
avoid parsing opened files when loading project #1289
Browse files Browse the repository at this point in the history
  • Loading branch information
dolik-rce committed Nov 3, 2023
1 parent efd1f00 commit ef7efb9
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 13 deletions.
67 changes: 60 additions & 7 deletions projectorganizer/src/prjorg-project.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,13 +276,24 @@ static GeanyFiletype *filetypes_detect(const gchar *utf8_filename)
}


static gboolean string_exists_in_array(gchar **array, gchar *str) {
gchar *i = *array;
while (i) {
if (g_str_equal(str, i)) return TRUE;
i++;
}
return FALSE;
}

static void regenerate_tags(PrjOrgRoot *root, gpointer user_data)
{
GHashTableIter iter;
gpointer key, value;
GPtrArray *source_files;
GHashTable *file_table;
gchar **open_files;

open_files = (gchar **) user_data;
source_files = g_ptr_array_new();
file_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GFreeFunc)tm_source_file_free);
g_hash_table_iter_init(&iter, root->file_table);
Expand All @@ -295,7 +306,7 @@ static void regenerate_tags(PrjOrgRoot *root, gpointer user_data)

if (g_strcmp0(PROJORG_DIR_ENTRY, basename) != 0)
sf = tm_source_file_new(locale_path, filetypes_detect(utf8_path)->name);
if (sf && !document_find_by_filename(utf8_path) )
if (sf && !document_find_by_filename(utf8_path) && !string_exists_in_array(open_files, utf8_path))
g_ptr_array_add(source_files, sf);

g_hash_table_insert(file_table, g_strdup(utf8_path), sf);
Expand All @@ -310,7 +321,7 @@ static void regenerate_tags(PrjOrgRoot *root, gpointer user_data)
}


void prjorg_project_rescan(void)
void prjorg_project_rescan(gchar **open_files)
{
GSList *elem;
gint filenum = 0;
Expand All @@ -325,7 +336,7 @@ void prjorg_project_rescan(void)
filenum += prjorg_project_rescan_root(elem->data);

if (prj_org->generate_tag_prefs == PrjOrgTagYes || (prj_org->generate_tag_prefs == PrjOrgTagAuto && filenum < 1000))
g_slist_foreach(prj_org->roots, (GFunc)regenerate_tags, NULL);
g_slist_foreach(prj_org->roots, (GFunc)regenerate_tags, open_files);
}


Expand All @@ -343,6 +354,7 @@ static void update_project(
gchar **header_patterns,
gchar **ignored_dirs_patterns,
gchar **ignored_file_patterns,
gchar **open_files,
PrjOrgTagPrefs generate_tag_prefs,
gboolean show_empty_dirs)
{
Expand Down Expand Up @@ -374,7 +386,7 @@ static void update_project(
prj_org->roots = g_slist_prepend(prj_org->roots, create_root(utf8_base_path));
g_free(utf8_base_path);

prjorg_project_rescan();
prjorg_project_rescan(open_files);
}


Expand Down Expand Up @@ -471,7 +483,7 @@ void prjorg_project_add_external_dir(const gchar *utf8_dirname)
lst = g_slist_sort(lst, (GCompareFunc)root_comparator);
prj_org->roots->next = lst;

prjorg_project_rescan();
prjorg_project_rescan(NULL);
}


Expand All @@ -485,7 +497,7 @@ void prjorg_project_remove_external_dir(const gchar *utf8_dirname)

prj_org->roots = g_slist_remove(prj_org->roots, found_root);
close_root(found_root, NULL);
prjorg_project_rescan();
prjorg_project_rescan(NULL);
}
close_root(test_root, NULL);
}
Expand All @@ -497,13 +509,51 @@ gchar **prjorg_project_load_expanded_paths(GKeyFile * key_file)
}


static GPtrArray *get_session_files(GKeyFile *config)
{
guint i;
gboolean have_session_files;
gchar entry[16];
gchar **tmp_array;
GError *error = NULL;
GPtrArray *files;
gchar *locale_filename, *unescaped_filename;

files = g_ptr_array_new();
have_session_files = TRUE;
i = 0;
while (have_session_files)
{
g_snprintf(entry, sizeof(entry), "FILE_NAME_%d", i);
tmp_array = g_key_file_get_string_list(config, "files", entry, NULL, &error);
if (! tmp_array || error)
{
g_error_free(error);
error = NULL;
have_session_files = FALSE;
} else {
unescaped_filename = g_uri_unescape_string(tmp_array[7], NULL);
locale_filename = utils_get_locale_from_utf8(unescaped_filename);
g_ptr_array_add(files, g_strdup(locale_filename));
g_free(locale_filename);
g_free(unescaped_filename);
}
i++;
}
g_ptr_array_add(files, NULL);

return files;
}


void prjorg_project_open(GKeyFile * key_file)
{
gchar **source_patterns, **header_patterns, **ignored_dirs_patterns, **ignored_file_patterns, **external_dirs, **dir_ptr, *last_name;
gint generate_tag_prefs;
gboolean show_empty_dirs;
GSList *elem = NULL, *ext_list = NULL;
gchar *utf8_base_path;
GPtrArray *open_files;

if (prj_org != NULL)
prjorg_project_close();
Expand Down Expand Up @@ -532,6 +582,7 @@ void prjorg_project_open(GKeyFile * key_file)
generate_tag_prefs = utils_get_setting_integer(key_file, "prjorg", "generate_tag_prefs", PrjOrgTagAuto);
show_empty_dirs = utils_get_setting_boolean(key_file, "prjorg", "show_empty_dirs", TRUE);

open_files = get_session_files(key_file);
external_dirs = g_key_file_get_string_list(key_file, "prjorg", "external_dirs", NULL, NULL);
foreach_strv (dir_ptr, external_dirs)
ext_list = g_slist_prepend(ext_list, *dir_ptr);
Expand All @@ -555,6 +606,7 @@ void prjorg_project_open(GKeyFile * key_file)
header_patterns,
ignored_dirs_patterns,
ignored_file_patterns,
open_files->pdata,
generate_tag_prefs,
show_empty_dirs);

Expand All @@ -563,6 +615,7 @@ void prjorg_project_open(GKeyFile * key_file)
g_strfreev(ignored_dirs_patterns);
g_strfreev(ignored_file_patterns);
g_strfreev(external_dirs);
g_ptr_array_free(open_files, TRUE);
}


Expand Down Expand Up @@ -594,7 +647,7 @@ void prjorg_project_read_properties_tab(void)
ignored_file_patterns = split_patterns(gtk_entry_get_text(GTK_ENTRY(e->ignored_file_patterns)));

update_project(
source_patterns, header_patterns, ignored_dirs_patterns, ignored_file_patterns,
source_patterns, header_patterns, ignored_dirs_patterns, ignored_file_patterns, NULL,
gtk_combo_box_get_active(GTK_COMBO_BOX(e->generate_tag_prefs)),
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(e->show_empty_dirs)));

Expand Down
2 changes: 1 addition & 1 deletion projectorganizer/src/prjorg-project.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ void prjorg_project_close(void);

void prjorg_project_save(GKeyFile * key_file);
void prjorg_project_read_properties_tab(void);
void prjorg_project_rescan(void);
void prjorg_project_rescan(gchar **open_files);

void prjorg_project_add_external_dir(const gchar *utf8_dirname);
void prjorg_project_remove_external_dir(const gchar *utf8_dirname);
Expand Down
10 changes: 5 additions & 5 deletions projectorganizer/src/prjorg-sidebar.c
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ static void on_create_file(G_GNUC_UNUSED GtkMenuItem *menuitem, G_GNUC_UNUSED gp
{
open_file(path);
//TODO: don't rescan the whole project, only change the affected file
prjorg_project_rescan();
prjorg_project_rescan(NULL);
prjorg_sidebar_update(TRUE);
}
else
Expand Down Expand Up @@ -528,7 +528,7 @@ static void on_create_dir(G_GNUC_UNUSED GtkMenuItem *menuitem, G_GNUC_UNUSED gpo
if (create_dir(path))
{
//TODO: don't rescan the whole project, only change the affected directory
prjorg_project_rescan();
prjorg_project_rescan(NULL);
prjorg_sidebar_update(TRUE);
}
else
Expand Down Expand Up @@ -569,7 +569,7 @@ static void on_rename(G_GNUC_UNUSED GtkMenuItem *menuitem, G_GNUC_UNUSED gpointe
if (rename_file_or_dir(oldpath, newpath))
{
//TODO: don't rescan the whole project, only change the affected file
prjorg_project_rescan();
prjorg_project_rescan(NULL);
prjorg_sidebar_update(TRUE);
}
else
Expand Down Expand Up @@ -610,7 +610,7 @@ static void on_delete(G_GNUC_UNUSED GtkMenuItem *menuitem, G_GNUC_UNUSED gpointe
g_free(path);

//TODO: don't rescan the whole project, only change the affected file
prjorg_project_rescan();
prjorg_project_rescan(NULL);
prjorg_sidebar_update(TRUE);
}

Expand Down Expand Up @@ -998,7 +998,7 @@ static void on_find_tag(G_GNUC_UNUSED GtkMenuItem *menuitem, G_GNUC_UNUSED gpoin

static void on_reload_project(G_GNUC_UNUSED GtkMenuItem *menuitem, G_GNUC_UNUSED gpointer user_data)
{
prjorg_project_rescan();
prjorg_project_rescan(NULL);
prjorg_sidebar_update(TRUE);
}

Expand Down

0 comments on commit ef7efb9

Please sign in to comment.