Thread (4 messages) flat view 4 messages, 3 authors, 2016-06-15

Re: [PATCH] Make git tag a builtin.

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:43:22

Hi,

On Fri, 20 Jul 2007, Junio C Hamano wrote:
Carlos Rica [off-list ref] writes:
quoted
This replaces the script "git-tag.sh" with "builtin-tag.c".
Thanks.  Will queue in 'next', and perhaps with a few nit fixups
to merge as the first thing after 1.5.3.
Nice!
launch-editor() would need adjustment for GIT_EDITOR and core.editor 
which should be straightforward.
Yes.  As a separate commit?  After a couple of revisions, I lost track of 
what I looked at, and what not...  So it would make it easier for me to 
have these changes after the big builtin-tag commit.
quoted
+		sp = buf = read_sha1_file(sha1, &type, &size);
+		if (!buf || !size)
+			return 0;
Theoretically, I can create millions of lightweight tags, all of
them pointing at a zero-length blob object (or an empty tree
object) and kill you with memory leak here ;-).
Yes ;-)  Would we really want to say

	if (!buf)
		return 0;
	if (!size) {
		free(buf);
		return 0;
	}

here?  IMHO that is overkill.
quoted
+		/* skip header */
+		while (sp + 1 < buf + size &&
+				!(sp[0] == '\n' && sp[1] == '\n'))
+			sp++;
+		/* only take up to "lines" lines, and strip the signature */
+		for (i = 0, sp += 2; i < filter->lines && sp < buf + size &&
+				prefixcmp(sp, PGP_SIGNATURE "\n");
+				i++) {
Minor nit; I would have split this to four physical lines, like:

		for (i = 0, sp += 2;
			i < filter->lines && sp < buf + size &&
			prefixcmp(sp, PGP_SIGNATURE "\n");
			i++) {

The places that semicolons appear are more significant gaps when
reading the code.
I am to blame for that.  That code was outlined by me.
quoted
+int cmd_tag(int argc, const char **argv, const char *prefix)
+{
...
+		if (!strcmp(arg, "-F")) {
+			unsigned long len;
+			int fd;
+
+			annotate = 1;
+			i++;
+			if (i == argc)
+				die("option -F needs an argument.");
+
+			if (!strcmp(argv[i], "-"))
+				fd = 0;
+			else {
+				fd = open(argv[i], O_RDONLY);
+				if (fd < 0)
+					die("could not open '%s': %s",
+						argv[i], strerror(errno));
+			}
+			len = 1024;
+			message = xmalloc(len);
You cannot anticipate how many bytes the user will type (or
pipe-in), but when you opened the file you could fstat() to see
how many bytes you would need to hold the contents of that
file.  Even in stdin case fstat(fd) could tell you the size, but
I am not sure how to tell if the st_size is reliable.  But for
the purposes of "git tag", 1k buffer that grows on demand is
probably cheaper than a fstat() syscall.
For a one-shot program as git-tag, I agree, the current patch is 
sufficient.

Ciao,
Dscho
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help