static void ide_git_vcs_real_reloaded (IdeGitVcs *self, GgitRepository *repository) { g_assert (IDE_IS_GIT_VCS (self)); g_assert (GGIT_IS_REPOSITORY (repository)); g_object_notify (G_OBJECT (self), "branch-name"); }
static void ide_git_buffer_change_monitor_set_repository (IdeGitBufferChangeMonitor *self, GgitRepository *repository) { g_return_if_fail (IDE_IS_GIT_BUFFER_CHANGE_MONITOR (self)); g_return_if_fail (GGIT_IS_REPOSITORY (repository)); g_set_object (&self->repository, repository); }
/** * ggit_remote_new_anonymous: * @repository: a #GgitRepository. * @url: the remote repository's URL. * @error: a #GError for error reporting, or %NULL. * * Creates a remote with the specified refspec in memory. You can use * this when you have a URL instead of a remote's name. * * Returns: (transfer full) (nullable): a newly allocated #GgitRemote or %NULL. */ GgitRemote * ggit_remote_new_anonymous (GgitRepository *repository, const gchar *url, GError **error) { gint ret; git_remote *remote; g_return_val_if_fail (GGIT_IS_REPOSITORY (repository), NULL); g_return_val_if_fail (url != NULL, NULL); ret = git_remote_create_anonymous (&remote, _ggit_native_get (repository), url); if (ret != GIT_OK) { _ggit_error_set (error, ret); return NULL; } return _ggit_remote_wrap (remote); }
static gboolean ide_git_buffer_change_monitor_calculate_threaded (IdeGitBufferChangeMonitor *self, DiffTask *diff, GError **error) { g_autofree gchar *relative_path = NULL; g_autoptr(GFile) workdir = NULL; const guint8 *data; gsize data_len = 0; g_assert (IDE_IS_GIT_BUFFER_CHANGE_MONITOR (self)); g_assert (diff); g_assert (G_IS_FILE (diff->file)); g_assert (diff->state); g_assert (GGIT_IS_REPOSITORY (diff->repository)); g_assert (diff->content); g_assert (!diff->blob || GGIT_IS_BLOB (diff->blob)); g_assert (error); g_assert (!*error); workdir = ggit_repository_get_workdir (diff->repository); if (!workdir) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_FILENAME, _("Repository does not have a working directory.")); return FALSE; } relative_path = g_file_get_relative_path (workdir, diff->file); if (!relative_path) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_FILENAME, _("File is not under control of git working directory.")); return FALSE; } diff->is_child_of_workdir = TRUE; /* * Find the blob if necessary. This will be cached by the main thread for us on the way out * of the async operation. */ if (!diff->blob) { GgitOId *entry_oid = NULL; GgitOId *oid = NULL; GgitObject *blob = NULL; GgitObject *commit = NULL; GgitRef *head = NULL; GgitTree *tree = NULL; GgitTreeEntry *entry = NULL; head = ggit_repository_get_head (diff->repository, error); if (!head) goto cleanup; oid = ggit_ref_get_target (head); if (!oid) goto cleanup; commit = ggit_repository_lookup (diff->repository, oid, GGIT_TYPE_COMMIT, error); if (!commit) goto cleanup; tree = ggit_commit_get_tree (GGIT_COMMIT (commit)); if (!tree) goto cleanup; entry = ggit_tree_get_by_path (tree, relative_path, error); if (!entry) goto cleanup; entry_oid = ggit_tree_entry_get_id (entry); if (!entry_oid) goto cleanup; blob = ggit_repository_lookup (diff->repository, entry_oid, GGIT_TYPE_BLOB, error); if (!blob) goto cleanup; diff->blob = g_object_ref (blob); cleanup: g_clear_object (&blob); g_clear_pointer (&entry_oid, ggit_oid_free); g_clear_pointer (&entry, ggit_tree_entry_unref); g_clear_object (&tree); g_clear_object (&commit); g_clear_pointer (&oid, ggit_oid_free); g_clear_object (&head); } if (!diff->blob) { if ((*error) == NULL) g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("The requested file does not exist within the git index.")); return FALSE; } data = g_bytes_get_data (diff->content, &data_len); ggit_diff_blob_to_buffer (diff->blob, relative_path, data, data_len, relative_path, NULL, NULL, NULL, NULL, diff_line_cb, (gpointer)diff->state, error); return ((*error) == NULL); }