Edit

kc3-lang/libgit2/examples/commit.c

Branch :

  • Show log

    Commit

  • Author : Edward Thomson
    Date : 2024-06-14 12:50:40
    Hash : 649ef1cc
    Message : signature: add `git_signature_default_from_env` People who are doing a commit expect a unified timestamp between author and committer information when we're using the current timestamp. Provide a single function that returns both author and committer information so that they can have an identical timestamp when none is specified in the environment.

  • examples/commit.c
  • /*
     * 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
     * <http://creativecommons.org/publicdomain/zero/1.0/>.
     */
    
    #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 *author_signature, *committer_signature;
    
    	/* Validate args */
    	if (argc < 3 || strcmp(opt, "-m") != 0) {
    		printf ("USAGE: %s -m <comment>\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_from_env(&author_signature, &committer_signature, repo),
    			"Error creating signature", NULL);
    
    	check_lg2(git_commit_create_v(
    		&commit_oid,
    		repo,
    		"HEAD",
    		author_signature,
    		committer_signature,
    		NULL,
    		comment,
    		tree,
    		parent ? 1 : 0, parent), "Error creating commit", NULL);
    
    	git_index_free(index);
    	git_signature_free(author_signature);
    	git_signature_free(committer_signature);
    	git_tree_free(tree);
    	git_object_free(parent);
    	git_reference_free(ref);
    
    	return error;
    }