/** * Check branch argument * * @param arg the arg to check * @return 0 if OK, else 1 */ int git2r_arg_check_branch(SEXP arg) { SEXP class_name; SEXP slot; if (R_NilValue == arg || S4SXP != TYPEOF(arg)) return 1; class_name = getAttrib(arg, R_ClassSymbol); if (0 != strcmp(CHAR(STRING_ELT(class_name, 0)), "git_branch")) return 1; if (git2r_arg_check_string(GET_SLOT(arg, Rf_install("name")))) return 1; slot = GET_SLOT(arg, Rf_install("type")); if (git2r_arg_check_integer(slot)) return 1; switch (INTEGER(slot)[0]) { case GIT_BRANCH_LOCAL: case GIT_BRANCH_REMOTE: break; default: return 1; } return 0; }
/** * Reset current HEAD to the specified state * * @param commit The commit to which the HEAD should be moved to. * @param reset_type Kind of reset operation to perform. 'soft' means * the Head will be moved to the commit. 'mixed' reset will trigger a * 'soft' reset, plus the index will be replaced with the content of * the commit tree. 'hard' reset will trigger a 'mixed' reset and the * working directory will be replaced with the content of the index. * @return R_NilValue */ SEXP git2r_reset(SEXP commit, SEXP reset_type) { int error; SEXP repo; git_commit *target = NULL; git_repository *repository = NULL; if (git2r_arg_check_commit(commit)) git2r_error(__func__, NULL, "'commit'", git2r_err_commit_arg); if (git2r_arg_check_integer(reset_type)) git2r_error(__func__, NULL, "'reset_type'", git2r_err_integer_arg); repo = git2r_get_list_element(commit, "repo"); repository = git2r_repository_open(repo); if (!repository) git2r_error(__func__, NULL, git2r_err_invalid_repository, NULL); error = git2r_commit_lookup(&target, repository, commit); if (error) goto cleanup; error = git_reset( repository, (git_object*)target, INTEGER(reset_type)[0], NULL); cleanup: git_commit_free(target); git_repository_free(repository); if (error) git2r_error(__func__, GIT2R_ERROR_LAST(), NULL, NULL); return R_NilValue; }