static void index_files_done (void *result) { IndexAux *aux = result; CloneTask *task = aux->task; if (!aux->success) { transition_to_error (task, CLONE_ERROR_INDEX); goto out; } if (task->state == CLONE_STATE_CANCEL_PENDING) { transition_state (task, CLONE_STATE_CANCELED); goto out; } if (add_transfer_task (aux->mgr, task, NULL) < 0) { transition_to_error (task, CLONE_ERROR_FETCH); goto out; } transition_state (task, CLONE_STATE_FETCH); out: g_free (aux); return; }
static int start_index_or_transfer (SeafCloneManager *mgr, CloneTask *task, GError **error) { IndexAux *aux; int ret = 0; if (is_non_empty_directory (task->worktree)) { transition_state (task, CLONE_STATE_INDEX); aux = g_new0 (IndexAux, 1); aux->mgr = mgr; aux->task = task; ccnet_job_manager_schedule_job (seaf->job_mgr, index_files_job, index_files_done, aux); } else { ret = add_transfer_task (mgr, task, error); if (ret == 0) transition_state (task, CLONE_STATE_FETCH); else transition_to_error (task, CLONE_ERROR_FETCH); } return ret; }
static void start_clone_v2 (CloneTask *task) { GError *error = NULL; if (g_access (task->worktree, F_OK) != 0 && g_mkdir_with_parents (task->worktree, 0777) < 0) { seaf_warning ("[clone mgr] Failed to create worktree %s.\n", task->worktree); transition_to_error (task, CLONE_ERROR_FETCH); return; } SeafRepo *repo = seaf_repo_manager_get_repo (seaf->repo_mgr, task->repo_id); if (repo != NULL) { seaf_repo_manager_set_repo_token (seaf->repo_mgr, repo, task->token); seaf_repo_manager_set_repo_email (seaf->repo_mgr, repo, task->email); seaf_repo_manager_set_repo_relay_info (seaf->repo_mgr, repo->id, task->peer_addr, task->peer_port); if (task->server_url) { seaf_repo_manager_set_repo_property (seaf->repo_mgr, repo->id, REPO_PROP_SERVER_URL, task->server_url); } mark_clone_done_v2 (repo, task); return; } if (add_transfer_task (task, &error) == 0) transition_state (task, CLONE_STATE_FETCH); else transition_to_error (task, CLONE_ERROR_FETCH); }