From dc2beb7e2db7bea94a5bd5f8c6e10467f94ff3cc Mon Sep 17 00:00:00 2001 From: Peter Salomonsen Date: Mon, 24 Feb 2020 18:30:16 +0100 Subject: examples: additions and fixes add example for git commit fix example for git add add example for git push --- examples/add.c | 4 ++- examples/commit.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ examples/common.h | 2 ++ examples/lg2.c | 2 ++ examples/push.c | 56 +++++++++++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 examples/commit.c create mode 100644 examples/push.c (limited to 'examples') diff --git a/examples/add.c b/examples/add.c index 6e3c239fc..542360ea9 100644 --- a/examples/add.c +++ b/examples/add.c @@ -48,9 +48,11 @@ int lg2_add(git_repository *repo, int argc, char **argv) git_index_matched_path_cb matched_cb = NULL; git_index *index; git_strarray array = {0}; - struct index_options options; + struct index_options options = {0}; struct args_info args = ARGS_INFO_INIT; + options.mode = INDEX_ADD; + /* Parse the options & arguments. */ parse_opts(NULL, &options, &args); strarray_from_args(&array, &args); diff --git a/examples/commit.c b/examples/commit.c new file mode 100644 index 000000000..cd9782de1 --- /dev/null +++ b/examples/commit.c @@ -0,0 +1,84 @@ +/* + * libgit2 "commit" example - shows how to create a git commit + * + * Written by the libgit2 contributors + * + * To the extent possible under law, the author(s) have dedicated all copyright + * and related and neighboring rights to this software to the public domain + * worldwide. This software is distributed without any warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication along + * with this software. If not, see + * . + */ + +#include "common.h" + +/** + * This example demonstrates the libgit2 commit APIs to roughly + * simulate `git commit` with the commit message argument. + * + * This does not have: + * + * - Robust error handling + * - Most of the `git commit` options + * + * This does have: + * + * - Example of performing a git commit with a comment + * + */ +int lg2_commit(git_repository *repo, int argc, char **argv) +{ + const char *opt = argv[1]; + const char *comment = argv[2]; + int error; + + git_oid commit_oid,tree_oid; + git_tree *tree; + git_index *index; + git_object *parent = NULL; + git_reference *ref = NULL; + git_signature *signature; + + /* Validate args */ + if (argc < 3 || strcmp(opt, "-m") != 0) { + printf ("USAGE: %s -m \n", argv[0]); + return -1; + } + + error = git_revparse_ext(&parent, &ref, repo, "HEAD"); + if (error == GIT_ENOTFOUND) { + printf("HEAD not found. Creating first commit\n"); + error = 0; + } else if (error != 0) { + const git_error *err = git_error_last(); + if (err) printf("ERROR %d: %s\n", err->klass, err->message); + else printf("ERROR %d: no detailed info\n", error); + } + + check_lg2(git_repository_index(&index, repo), "Could not open repository index", NULL); + check_lg2(git_index_write_tree(&tree_oid, index), "Could not write tree", NULL);; + check_lg2(git_index_write(index), "Could not write index", NULL);; + + check_lg2(git_tree_lookup(&tree, repo, &tree_oid), "Error looking up tree", NULL); + + check_lg2(git_signature_default(&signature, repo), "Error creating signature", NULL); + + check_lg2(git_commit_create_v( + &commit_oid, + repo, + "HEAD", + signature, + signature, + NULL, + comment, + tree, + parent ? 1 : 0, parent), "Error creating commit", NULL); + + git_index_free(index); + git_signature_free(signature); + git_tree_free(tree); + + return error; +} diff --git a/examples/common.h b/examples/common.h index c01561b48..0126568ab 100644 --- a/examples/common.h +++ b/examples/common.h @@ -59,6 +59,7 @@ extern int lg2_blame(git_repository *repo, int argc, char **argv); extern int lg2_cat_file(git_repository *repo, int argc, char **argv); extern int lg2_checkout(git_repository *repo, int argc, char **argv); extern int lg2_clone(git_repository *repo, int argc, char **argv); +extern int lg2_commit(git_repository *repo, int argc, char **argv); extern int lg2_config(git_repository *repo, int argc, char **argv); extern int lg2_describe(git_repository *repo, int argc, char **argv); extern int lg2_diff(git_repository *repo, int argc, char **argv); @@ -71,6 +72,7 @@ extern int lg2_log(git_repository *repo, int argc, char **argv); extern int lg2_ls_files(git_repository *repo, int argc, char **argv); extern int lg2_ls_remote(git_repository *repo, int argc, char **argv); extern int lg2_merge(git_repository *repo, int argc, char **argv); +extern int lg2_push(git_repository *repo, int argc, char **argv); extern int lg2_remote(git_repository *repo, int argc, char **argv); extern int lg2_rev_list(git_repository *repo, int argc, char **argv); extern int lg2_rev_parse(git_repository *repo, int argc, char **argv); diff --git a/examples/lg2.c b/examples/lg2.c index a3987c34d..7946bc215 100644 --- a/examples/lg2.c +++ b/examples/lg2.c @@ -15,6 +15,7 @@ struct { { "cat-file", lg2_cat_file, 1 }, { "checkout", lg2_checkout, 1 }, { "clone", lg2_clone, 0 }, + { "commit", lg2_commit, 1 }, { "config", lg2_config, 1 }, { "describe", lg2_describe, 1 }, { "diff", lg2_diff, 1 }, @@ -27,6 +28,7 @@ struct { { "ls-files", lg2_ls_files, 1 }, { "ls-remote", lg2_ls_remote, 1 }, { "merge", lg2_merge, 1 }, + { "push", lg2_push, 1 }, { "remote", lg2_remote, 1 }, { "rev-list", lg2_rev_list, 1 }, { "rev-parse", lg2_rev_parse, 1 }, diff --git a/examples/push.c b/examples/push.c new file mode 100644 index 000000000..bcf307607 --- /dev/null +++ b/examples/push.c @@ -0,0 +1,56 @@ +/* + * libgit2 "push" example - shows how to push to remote + * + * Written by the libgit2 contributors + * + * To the extent possible under law, the author(s) have dedicated all copyright + * and related and neighboring rights to this software to the public domain + * worldwide. This software is distributed without any warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication along + * with this software. If not, see + * . + */ + +#include "common.h" + +/** + * This example demonstrates the libgit2 push API to roughly + * simulate `git push`. + * + * This does not have: + * + * - Robust error handling + * - Any of the `git push` options + * + * This does have: + * + * - Example of push to origin/master + * + */ + +/** Entry point for this command */ +int lg2_push(git_repository *repo, int argc, char **argv) { + git_push_options options; + git_remote* remote = NULL; + char *refspec = "refs/heads/master"; + const git_strarray refspecs = { + &refspec, + 1 + }; + + /* Validate args */ + if (argc > 1) { + printf ("USAGE: %s\n\nsorry, no arguments supported yet\n", argv[0]); + return -1; + } + + check_lg2(git_remote_lookup(&remote, repo, "origin" ), "Unable to lookup remote", NULL); + + check_lg2(git_push_options_init(&options, GIT_PUSH_OPTIONS_VERSION ), "Error initializing push", NULL); + + check_lg2(git_remote_push(remote, &refspecs, &options), "Error pushing", NULL); + + printf("pushed\n"); + return 0; +} -- cgit v1.2.1