static GFile * get_file (AnjutaProjectNode *target, const char *id) { AnjutaProjectNode *group = (AnjutaProjectNode *)anjuta_project_node_parent (target); return g_file_resolve_relative_path (anjuta_project_node_get_file (group), id); }
static void list_source (IAnjutaProject *project, AnjutaProjectNode *root, AnjutaProjectNode *source, gint indent, const gchar *path) { GFile *file; gchar *rel_path; if (source == NULL) return; file = anjuta_project_node_get_file (source); rel_path = g_file_get_relative_path (anjuta_project_node_get_file (root), file); print ("%*sSOURCE (%s): %s", indent * INDENT, "", no_id ? "" : path, rel_path); list_property (project, source, indent + 1); g_free (rel_path); }
static void list_group (IAnjutaProject *project, AnjutaProjectNode *root, AnjutaProjectNode *group, gint indent, const gchar *path) { AnjutaProjectNode *parent; gchar *rel_path; GFile *file; parent = anjuta_project_node_parent (group); file = anjuta_project_node_get_file (parent); rel_path = g_file_get_relative_path (file, anjuta_project_node_get_file (group)); print ("%*sGROUP (%s): %s", indent * INDENT, "", no_id ? "" : path, rel_path); g_free (rel_path); list_property (project, group, indent + 1); list_children (project, root, group, indent, path); }
static AnjutaProjectNode * mkp_project_load_root (MkpProject *project, AnjutaProjectNode *node, GError **error) { GFile *root_file; GFile *make_file = NULL; const gchar **makefile; MkpGroup *group; /* Unload current project */ root_file = g_object_ref (anjuta_project_node_get_file (node)); mkp_project_unload (project); project->root_file = root_file; DEBUG_PRINT ("reload project %p root file %p", project, project->root_file); /* shortcut hash tables */ project->groups = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); project->files = g_hash_table_new_full (g_file_hash, (GEqualFunc)g_file_equal, g_object_unref, g_object_unref); project->variables = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify)mkp_variable_free); /* Initialize rules data */ mkp_project_init_rules (project); /* Initialize list styles */ project->space_list = anjuta_token_style_new (NULL, " ", "\n", NULL, 0); project->arg_list = anjuta_token_style_new (NULL, ", ", ",\n ", ")", 0); /* Find make file */ for (makefile = valid_makefiles; *makefile != NULL; makefile++) { if (file_type (root_file, *makefile) == G_FILE_TYPE_REGULAR) { make_file = g_file_get_child (root_file, *makefile); break; } } if (make_file == NULL) { g_set_error (error, IANJUTA_PROJECT_ERROR, IANJUTA_PROJECT_ERROR_DOESNT_EXIST, _("Project doesn't exist or invalid path")); return NULL; } /* Create group */ group = MKP_GROUP(mkp_group_new (root_file)); anjuta_project_node_append (node, ANJUTA_PROJECT_NODE(group)); g_hash_table_insert (project->groups, g_file_get_uri (root_file), group); /* Parse make file */ project_load_makefile (project, make_file, group, error); g_object_unref (make_file); monitors_setup (project); return node; }
static void quick_open_plugin_project_added(QuickOpenPlugin* self, IAnjutaProject* project) { AnjutaProjectNode* root; GFile* project_root; root = ianjuta_project_get_root(project, NULL); project_root = anjuta_project_node_get_file(root); quick_open_dialog_set_project_root(self->dialog, project_root); if (ianjuta_project_is_loaded(project, NULL)) quick_open_plugin_load_project_files(self, project); }
GList * gbf_project_util_replace_by_file (GList* list) { GList* link; for (link = g_list_first (list); link != NULL; link = g_list_next (link)) { AnjutaProjectNode *node = (AnjutaProjectNode *)link->data; link->data = g_object_ref (anjuta_project_node_get_file (node)); } return list; }
static AmpGroupNode* project_load_makefile (AmpProject *project, AmpGroupNode *group) { const gchar **filename; AnjutaTokenFile *tfile; GFile *makefile = NULL; GFile *file = anjuta_project_node_get_file ((AnjutaProjectNode *)group); /* Find makefile name * It has to be in the config_files list with .am extension */ for (filename = valid_am_makefiles; *filename != NULL; filename++) { makefile = g_file_get_child (file, *filename); if (file_type (file, *filename) == G_FILE_TYPE_REGULAR) { gchar *final_filename = g_strdup (*filename); gchar *ptr; GFile *final_file; AnjutaToken *token; ptr = g_strrstr (final_filename,".am"); if (ptr != NULL) *ptr = '\0'; final_file = g_file_get_child (file, final_filename); g_free (final_filename); token = amp_project_get_config_token (project, final_file); g_object_unref (final_file); if (token != NULL) { amp_group_node_add_token (group, token, AM_GROUP_TOKEN_CONFIGURE); break; } } g_object_unref (makefile); } if (*filename == NULL) { /* Unable to find automake file */ return group; } /* Parse makefile.am */ DEBUG_PRINT ("Parse: %s", g_file_get_uri (makefile)); tfile = amp_group_node_set_makefile (group, makefile, project); project_load_group_module (project, group); return group; }
static void project_node_foreach_func(AnjutaProjectNode *node, gpointer data) { GSList** project_files = data; AnjutaProjectNodeType type; type = anjuta_project_node_get_node_type(node); if (type == ANJUTA_PROJECT_SOURCE) { GFile* file; file = anjuta_project_node_get_file(node); *project_files = g_slist_prepend(*project_files, file); } }
static void amp_group_node_update_preset_variable (AmpGroupNode *group) { gchar *path; AnjutaToken *value; AmpVariable *var; GFile *root; GFile *file; AnjutaProjectNode *node; if (group->preset_token != NULL) anjuta_token_free (group->preset_token); group->preset_token = anjuta_token_new_static (ANJUTA_TOKEN_FILE, NULL); /* Get project root */ for (node = ANJUTA_PROJECT_NODE (group); anjuta_project_node_parent (node) != NULL; node = anjuta_project_node_parent (node)); root = anjuta_project_node_get_file (node); /* Set source directory variables */ file = anjuta_project_node_get_file (group); value = anjuta_token_insert_token_list (FALSE, NULL, ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_ARGUMENT, NULL, ANJUTA_TOKEN_CONTENT, ".", NULL); anjuta_token_append_child (group->preset_token, value); var = amp_variable_new ("srcdir", 0, value); g_hash_table_insert (group->variables, var->name, var); var = amp_variable_new ("builddir", 0, value); g_hash_table_insert (group->variables, var->name, var); path = g_file_get_path (file); value = anjuta_token_insert_token_list (FALSE, NULL, ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_ARGUMENT, NULL, ANJUTA_TOKEN_CONTENT, path, NULL); g_free (path); anjuta_token_append_child (group->preset_token, value); var = amp_variable_new ("abs_srcdir", 0, value); g_hash_table_insert (group->variables, var->name, var); var = amp_variable_new ("abs_builddir", 0, value); g_hash_table_insert (group->variables, var->name, var); path = get_relative_path (file, root); value = anjuta_token_insert_token_list (FALSE, NULL, ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_ARGUMENT, NULL, ANJUTA_TOKEN_CONTENT, path, NULL); g_free (path); anjuta_token_append_child (group->preset_token, value); var = amp_variable_new ("top_srcdir", 0, value); g_hash_table_insert (group->variables, var->name, var); var = amp_variable_new ("top_builddir", 0, value); g_hash_table_insert (group->variables, var->name, var); path = g_file_get_path (root); value = anjuta_token_insert_token_list (FALSE, NULL, ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_ARGUMENT, NULL, ANJUTA_TOKEN_CONTENT, path, NULL); g_free (path); anjuta_token_append_child (group->preset_token, value); var = amp_variable_new ("abs_top_srcdir", 0, value); g_hash_table_insert (group->variables, var->name, var); var = amp_variable_new ("abs_top_builddir", 0, value); g_hash_table_insert (group->variables, var->name, var); }
static GList * mkp_project_find_dependencies (MkpProject *project, gchar *target, AnjutaProjectNode *parent, guint backtrack) { GFile *child; gboolean exist; GHashTableIter iter; gchar *key; MkpRule *rule; /* Check pattern rules */ if (backtrack < MAX_DEPENDENCIES) { for (g_hash_table_iter_init (&iter, project->rules); g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&rule);) { if (rule->pattern) { gchar *source; GList *dependencies; if (rule->part == NULL) { /* simple suffix rule */ source = g_strconcat (target, rule->name, NULL); } else { /* double suffix rule */ if (strcmp (target + strlen (target) - strlen (rule->part), rule->part) == 0) { gchar *suffix; source = g_strconcat (target, rule->name, NULL); suffix = source + strlen (target) - strlen (rule->part); memcpy (suffix, rule->name, rule->part - rule->name); *(suffix + (rule->part - rule->name)) = '\0'; } else { continue; } } dependencies = mkp_project_find_dependencies (project, source, parent, backtrack + 1); if (dependencies != NULL) { return g_list_prepend (dependencies, target); } g_free (source); } } } child = g_file_get_child (anjuta_project_node_get_file (parent), target); exist = g_file_query_exists (child, NULL); //g_message ("target =%s= filename =%s=", target, g_file_get_parse_name (child)); g_object_unref (child); if (!exist) { return NULL; } else { return g_list_prepend (NULL, target); } }
gboolean amp_group_node_create_token (AmpProject *project, AmpGroupNode *group, GError **error) { GFile *directory; GFile *makefile; AnjutaToken *list; gchar *basename; AnjutaTokenFile* tfile; AnjutaProjectNode *sibling; AmpGroupNode *parent; gboolean after; const gchar *name; /* Get parent target */ name = anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (group)); parent = AMP_GROUP_NODE (anjuta_project_node_parent_type(ANJUTA_PROJECT_NODE (group), ANJUTA_PROJECT_GROUP)); if (parent != NULL) { directory = g_file_get_child (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (parent)), name); } else { /* Used only when adding root group (a group named . in an empty project) */ parent = group; directory = g_object_ref (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (parent))); } /* Find a sibling if possible */ after = TRUE; for (sibling = anjuta_project_node_prev_sibling (ANJUTA_PROJECT_NODE (group)); sibling != NULL; sibling = anjuta_project_node_prev_sibling (sibling)) { if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_GROUP) break; } if (sibling == NULL) { after = FALSE; for (sibling = anjuta_project_node_next_sibling (ANJUTA_PROJECT_NODE (group)); sibling != NULL; sibling = anjuta_project_node_next_sibling (sibling)) { if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_GROUP) break; } } if (sibling == NULL) after = TRUE; /* Create Makefile.am */ basename = amp_group_node_get_makefile_name (parent); if (basename != NULL) { makefile = g_file_get_child (directory, basename); g_free (basename); } else { makefile = g_file_get_child (directory, "Makefile.am"); } /* Add in configure */ list = NULL; if (sibling) list = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_CONFIGURE); if (list == NULL) list= amp_group_node_get_first_token (parent, AM_GROUP_TOKEN_CONFIGURE); if (list != NULL) list = anjuta_token_list (list); if (list == NULL) { list = amp_project_write_config_list (project); list = anjuta_token_next (list); } if (list != NULL) { gchar *relative_make; gchar *ext; AnjutaToken *prev = NULL; AnjutaToken *token; if (sibling) { prev = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_CONFIGURE); /*if ((prev != NULL) && after) { prev = anjuta_token_next_word (prev); }*/ } //prev_token = (AnjutaToken *)token_list->data; relative_make = g_file_get_relative_path (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (project)), makefile); ext = relative_make + strlen (relative_make) - 3; if (strcmp (ext, ".am") == 0) { *ext = '\0'; } token = amp_project_write_config_file (project, list, after, prev, relative_make); amp_group_node_add_token (AMP_GROUP_NODE (group), token, AM_GROUP_TOKEN_CONFIGURE); g_free (relative_make); } /* Add in Makefile.am */ if (sibling == NULL) { list = anjuta_token_find_group_property_position (parent, AM_TOKEN_SUBDIRS); if (list != NULL) { list = anjuta_token_insert_token_list (FALSE, list, AM_TOKEN_SUBDIRS, "SUBDIRS", ANJUTA_TOKEN_SPACE, " ", ANJUTA_TOKEN_OPERATOR, "=", ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_LAST, NULL, NULL); list = anjuta_token_next (anjuta_token_next ( anjuta_token_next (list))); } } else { AnjutaToken *prev; prev = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_SUBDIRS); list = anjuta_token_list (prev); } if (list != NULL) { AnjutaToken *token; AnjutaToken *prev; AnjutaTokenStyle *style; style = anjuta_token_style_new_from_base (project->am_space_list); anjuta_token_style_update (style, list); if (sibling) { prev = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_SUBDIRS); } token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, name); if (after) { anjuta_token_insert_word_after (list, prev, token); } else { anjuta_token_insert_word_before (list, prev, token); } /* Try to use the same style than the current group list */ anjuta_token_style_format (style, list); anjuta_token_style_free (style); amp_group_node_update_makefile (parent, token); amp_group_node_add_token (group, token, AM_GROUP_TOKEN_SUBDIRS); } tfile = amp_group_node_set_makefile (group, makefile, project); amp_project_add_file (project, makefile, tfile); return TRUE; }
gboolean amp_source_node_create_token (AmpProject *project, AmpSourceNode *source, GError **error) { AmpGroupNode *group; AmpTargetNode *target; AnjutaProjectNode *sibling; gboolean after; AnjutaToken *token; AnjutaToken *prev; AnjutaToken *args; gchar *relative_name; /* Get parent target */ target = AMP_TARGET_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (source), ANJUTA_PROJECT_TARGET)); if (target == NULL) return FALSE; group = AMP_GROUP_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (target), ANJUTA_PROJECT_GROUP)); relative_name = get_relative_path (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (group)), anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (source))); /* Add in Makefile.am */ /* Find a sibling if possible */ after = TRUE; for (sibling = anjuta_project_node_prev_sibling (ANJUTA_PROJECT_NODE (source)); sibling != NULL; sibling = anjuta_project_node_prev_sibling (sibling)) { if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_SOURCE) { break; } else if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_OBJECT) { sibling = anjuta_project_node_first_child (sibling); break; } } if (sibling == NULL) { after = FALSE; for (sibling = anjuta_project_node_next_sibling (ANJUTA_PROJECT_NODE (source)); sibling != NULL; sibling = anjuta_project_node_next_sibling (sibling)) { if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_SOURCE) { break; } else if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_OBJECT) { sibling = anjuta_project_node_first_child (sibling); break; } } } if (sibling == NULL) { after = TRUE; prev = NULL; args = NULL; } else { prev = amp_source_node_get_token (AMP_SOURCE_NODE (sibling)); args = anjuta_token_list (prev); } /* Check if a valid source variable is already defined */ if (args == NULL) { GList *last; for (last = amp_target_node_get_token (target, AM_TOKEN__SOURCES); last != NULL; last = g_list_next (last)) { args = anjuta_token_last_item ((AnjutaToken *)last->data); break; } if (last == NULL) { for (last = amp_target_node_get_token (target, AM_TOKEN__DATA); last != NULL; last = g_list_next (last)) { args = anjuta_token_last_item ((AnjutaToken *)last->data); break; } } } if (args == NULL) { gchar *target_var; gchar *canon_name; AnjutaToken *var; canon_name = canonicalize_automake_variable (anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (target))); target_var = g_strconcat (canon_name, "_SOURCES", NULL); var = anjuta_token_find_target_property_position (target, AM_TOKEN__SOURCES); if (var == NULL) var = anjuta_token_find_target_property_position (target, AM_TOKEN__DATA); args = anjuta_token_insert_token_list (FALSE, var, ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_NAME, target_var, ANJUTA_TOKEN_SPACE, " ", ANJUTA_TOKEN_OPERATOR, "=", ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_SPACE, " ", NULL); args = anjuta_token_last_item (args); g_free (target_var); } if (args != NULL) { AnjutaTokenStyle *style; style = anjuta_token_style_new_from_base (project->am_space_list); anjuta_token_style_update (style, args); token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, relative_name); if (after) { anjuta_token_insert_word_after (args, prev, token); } else { anjuta_token_insert_word_before (args, prev, token); } /* Try to use the same style than the current target list */ anjuta_token_style_format (style, args); anjuta_token_style_free (style); amp_group_node_update_makefile (group, token); amp_source_node_add_token (source, token); } return TRUE; }