git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 9/9] Implement git commit as a builtin command.

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Sep 6, 2007, 16:59 UTC
Message-ID
<Pine.LNX.4.64.0709061741370.28586@racer.site>
In-Reply-To
<11890382271931-git-send-email-krh@redhat.com>
Hi,
On Wed, 5 Sep 2007, Kristian Høgsberg wrote:
>  contrib/examples/git-commit.sh |  665 +++++++++++++++++++++++++++++++++++
>  git-commit.sh                  |  665 -----------------------------------
You might want to use "git format-patch -M" next time ;-)
Show 5 quoted lines
> @@ -357,7 +358,6 @@ BUILTIN_OBJS = \
>  	builtin-rev-parse.o \
>  	builtin-revert.o \
>  	builtin-rm.o \
> -	builtin-runstatus.o \
Better keep it; some people's scripts could depend on it.
Show 9 quoted lines
> +struct option {
> +    enum option_type type;
> +    const char *long_name;
> +    char short_name;
> +    void *value;
> +};
> +
> +static int scan_options(const char ***argv, struct option *options)
> +{

I would not (no longer, anyway) be opposed to replacing the option parsing in git with getopt(); I hear that it is small enough to keep a copy in compat/getopt.c.

But let's go forward with builtin-commit; getopt() can come later.
Show 44 quoted lines
> +static char *
> +prepare_index(const char **files, const char *prefix)
> +{
> +	int fd;
> +	struct tree *tree;
> +	struct lock_file *next_index_lock;
> +
> +	fd = hold_locked_index(&lock_file, 1);
> +	if (read_cache() < 0)
> +		die("index file corrupt");
> +
> +	if (all) {
> +		add_files_to_cache(fd, files, NULL);
> +		return lock_file.filename;
> +	} else if (also) {
> +		add_files_to_cache(fd, files, prefix);
> +		return lock_file.filename;
> +	}
> +
> +	if (interactive)
> +		interactive_add();
> +
> +	if (*files == NULL) {
> +		/* Commit index as-is. */
> +		rollback_lock_file(&lock_file);
> +		return get_index_file();
> +	}
> +
> +	/*
> +	 * FIXME: Warn on unknown files.  Shell script does
> +	 *
> +	 *   commit_only=`git-ls-files --error-unmatch -- "$@"`
> +	 */
> +
> +	/*
> +	 * FIXME: shell script does
> +	 *
> +	 *   git-read-tree --index-output="$TMP_INDEX" -i -m HEAD
> +	 *
> +	 * which warns about unmerged files in the index.
> +	 */
> +
> +	/* update the user index file */
> +	add_files_to_cache(fd, files, prefix);
I suspect this, or ...
Show 14 quoted lines
> +
> +	if (!initial_commit) {
> +		tree = parse_tree_indirect(head_sha1);
> +		if (!tree)
> +			die("failed to unpack HEAD tree object");
> +		if (read_tree(tree, 0, NULL))
> +			die("failed to read HEAD tree object");
> +	}
> +
> +	/* Uh oh, abusing lock_file to create a garbage collected file */
> +	next_index_lock = xmalloc(sizeof(*next_index_lock));
> +	fd = hold_lock_file_for_update(next_index_lock,
> +				       git_path("next-index-%d", getpid()), 1);
> +	add_files_to_cache(fd, files, prefix);
... this, but not both.
Show 5 quoted lines
> +/* Find out if the message starting at position 'start' in the strbuf
> + * contains only whitespace and Signed-off-by lines. */
> +static int message_is_empty(struct strbuf *sb, int start)
> +{
> +	static const char signed_off_by[] = "Signed-off-by: ";
I think you already defined that globally earlier.
In the function message_is_empty() you write:
Show 7 quoted lines
> +	/* See if the template is just a prefix of the message. */
> +	strbuf_init(&tmpl);
> +	if (template_file && strbuf_read_path(&tmpl, template_file) > 0) {
> +		stripspace(&tmpl, 1);
> +		if (start + tmpl.len <= sb->len &&
> +		    memcmp(tmpl.buf, sb->buf + start, tmpl.len) == 0)
> +			start += tmpl.len;

Could we not bail out here, if there is no match? In that case, the message is clearly not empty...

Show 7 quoted lines
> +	/* Check if the rest is just whitespace and Signed-of-by's. */
> +	for (i = start; i < sb->len; i++) {
> +		nl = memchr(sb->buf + i, '\n', sb->len - i);
> +		if (nl)
> +			eol = nl - sb->buf;
> +		else
> +			eol = sb->len;

Why not just "if (isspace(sb->buf[i]) || sb->buf[i] == '\n') continue;"? This would also catch the cases where people indent their S-O-Bs.

Show 13 quoted lines
> +
> +		if (strlen(signed_off_by) <= eol - i &&
> +		    !prefixcmp(sb->buf + i, signed_off_by)) {
> +			i = eol;
> +			continue;
> +		}
> +		while (i < eol)
> +			if (!isspace(sb->buf[i++]))
> +				return 0;
> +	}
> +
> +	return 1;
> +}
I did not review the rest of the code closely yet...
All in all: well done!

Ciao, Dscho

Previous: Kristian HøgsbergNext: Kristian Høgsberg
Message 10 of 25 in “Enable wt-status output to a given FILE pointer.”
  1. 1/9 Enable wt-status output to a given FILE pointer.Kristian Høgsberg, Sep 6, 2007
  2. 2/9 Enable wt-status to run against non-standard index file.Kristian Høgsberg, Sep 6, 2007
  3. 3/9 Add strbuf_printf() to do formatted printing to a strbuf.Kristian Høgsberg, Sep 6, 2007
  4. 4/9 Introduce entry point for launching add--interactive.Kristian Høgsberg, Sep 6, 2007
  5. 5/9 Introduce strbuf_read_fd().Kristian Høgsberg, Sep 6, 2007
  6. 6/9 Rewrite launch_editor, create_tag and stripspace to use strbufs.Kristian Høgsberg, Sep 6, 2007
  7. 7/9 Add strbuf_read_path().Kristian Høgsberg, Sep 6, 2007
  8. 8/9 Export rerere() and launch_editor().Kristian Høgsberg, Sep 6, 2007
  9. 9/9 Implement git commit as a builtin command.Kristian Høgsberg, Sep 6, 2007
  10. Johannes SchindelinSep 6, 2007
  11. Kristian HøgsbergSep 17, 2007
  12. Johannes SchindelinSep 17, 2007
  13. Jeff KingSep 17, 2007
  14. Kristian HøgsbergSep 18, 2007
  15. Johannes SchindelinSep 6, 2007
  16. Johannes SchindelinSep 6, 2007
  17. Kristian HøgsbergSep 17, 2007
  18. Johannes SchindelinSep 6, 2007
  19. Kristian HøgsbergSep 17, 2007
  20. Johannes SchindelinSep 17, 2007
  21. Junio C HamanoSep 6, 2007
  22. Pierre HabouzitSep 6, 2007
  23. Pierre HabouzitSep 6, 2007
  24. Johannes SchindelinSep 6, 2007
  25. Kristian HøgsbergSep 17, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.