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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2007-11-01 at 16:51 -0700, Junio C Hamano wrote:

Hi Junio,

Thanks for the review (again).  I've split the patch up in a couple of
test suite patches (a patch to accept ':' as a no-op editor, fixing
hard-coding of editor, and a test case for the commit --amend --author
case), exporting launch_editor() and a reworked version of the commit
patch that addresses your comments.

> Kristian Høgsberg <krh@xxxxxxxxxx> writes:
> 
> > @@ -364,7 +365,6 @@ BUILTIN_OBJS = \
> >  	builtin-rev-parse.o \
> >  	builtin-revert.o \
> >  	builtin-rm.o \
> > -	builtin-runstatus.o \
> >  	builtin-shortlog.o \
> >  	builtin-show-branch.o \
> >  	builtin-stripspace.o \
> 
> I did not read in the commit log that runstatus is gone...

True, that should be documented.  Added in the following patch.

> > diff --git a/builtin-commit.c b/builtin-commit.c
> > new file mode 100644
> > index 0000000..56c7427
> > --- /dev/null
> > +++ b/builtin-commit.c
> > @@ -0,0 +1,608 @@
> > +/*
> > + * Builtin "git commit"
> > + *
> > + * Copyright (c) 2007 Kristian Høgsberg <krh@xxxxxxxxxx>
> > + * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
> > + */
> > +
> > +#include <sys/types.h>
> > +#include <sys/stat.h>
> > +#include <unistd.h>
> > +
> > +#include "cache.h"
> 
> 
> The system header files on some systems have a nasty habit of
> changing the behaviour depending on the order they are included.
> Since 85023577a8f4b540aa64aa37f6f44578c0c305a3 (simplify
> inclusion of system header files) in late 2006, we have a few
> rules for system-header inclusion to avoid the portability
> issues:
> 
>  (1) sources under compat/, platform sha-1 implementations, and
>      xdelta code are exempt from the following rules;
> 
>  (2) the first #include must be "git-compat-util.h" or one of
>      our own header file that includes it first (e.g. config.h,
>      builtin.h, pkt-line.h);
> 
>  (3) system headers that are included in "git-compat-util.h"
>      need not be included in individual C source files.
> 
>  (4) "git-compat-util.h" does not have to include subsystem
>      specific header files (e.g. expat.h).

Ah, yes, this has been pointed out to me before, sorry.  Patch updated.

> > +static void determine_author_info(struct strbuf *sb)
> > +{
> > +	char *p, *eol;
> > +	char *name = NULL, *email = NULL;
> > +
> > +	if (use_message) {
> > +		p = strstr(use_message_buffer, "\nauthor");
> > +		if (!p)
> > +			die("invalid commit: %s\n", use_message);
> > +		p++;
> > +		eol = strchr(p, '\n');
> > +		if (!eol)
> > +			die("invalid commit: %s\n", use_message);
> > +
> > +		strbuf_add(sb, p, eol + 1 - p);
> > +	} else if (force_author) {
> > +		const char *eoname = strstr(force_author, " <");
> > +		const char *eomail = strchr(force_author, '>');
> 
> Doesn't this break:
> 
>     $ git commit --amend --author='A U Thor <author@xxxxxxxxxxx>'
> 
> to fix a misattribution?

Dang, good catch.  I've fixed it by swapping the (use_message) and
(force_author) clauses and the new patch adds a test case for this.

> > +static int parse_and_validate_options(int argc, const char *argv[])
> > +{
> > ...
> > +	if (use_message) {
> > +		unsigned char sha1[20];
> > +		static char utf8[] = "UTF-8";
> > +		const char *out_enc;
> > +		char *enc, *end;
> > +		struct commit *commit;
> > +
> > +		if (get_sha1(use_message, sha1))
> > +			die("could not lookup commit %s", use_message);
> > +		commit = lookup_commit(sha1);
> > +		if (!commit || parse_commit(commit))
> > +			die("could not parse commit %s", use_message);
> > +
> > +		enc = strstr(commit->buffer, "\nencoding");
> > +		if (enc) {
> > +			end = strchr(enc + 10, '\n');
> > +			enc = xstrndup(enc + 10, end - (enc + 10));
> > +		} else {
> > +			enc = utf8;
> > +		}
> > +		out_enc = git_commit_encoding ? git_commit_encoding : utf8;
> > +
> > +		use_message_buffer =
> > +			reencode_string(commit->buffer, out_enc, enc);
> > +		if (enc != utf8)
> > +			free(enc);
> 
> A few issues.
> 
>  * When use_message is set because of --amend that wanted to
>    amend a commit message that was recorded in a corrupt
>    encoding, and iconv() in reencode_string() fails, saying "I
>    cannot convert that completely", most of the message can
>    still be salvageable.  This part should allow looser
>    reencoding if the message will be eyeballed and edited by the
>    user.

So in this case we just want to copy the old message byte for byte,
right?  That's what I have in the updated patch.

>  * We would want to avoid reencoding when !strcmp(out_enc, enc).
>    Both builtin-mailinfo.c and commit.c skip the call to the
>    function at the calling site, but it might make sense to
>    teach reencode_string() about such an optimization.

Right.  I just added the call-site optimization for builtin-commit for
now, but I would expect iconv() to be smart in case input and output
encodings are the same.

cheers,
Kristian


-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux