* FYI: git-am allows creation of empty commits. @ 2006-02-23 15:33 Eric W. Biederman 2006-02-24 5:56 ` Junio C Hamano 0 siblings, 1 reply; 8+ messages in thread From: Eric W. Biederman @ 2006-02-23 15:33 UTC (permalink / raw) To: git; +Cc: Junio C Hamano Currently I am using: git version 1.2.2.g709a. I have been rebasing and refactoring a number of patchsets using git. Frequently because of prior edits I will git a patch that does not apply at all. So all I get is the creation of the .dotest directory. The automatic merge logic does not kick in, so I have to manually call patch -p1 and resolve the differences but hand. There everything is expected and fine. Although it might have been nice to have one of those failed merge indicators in the index. After fixing it up and doing all of my edits I occasionally forget the git-update-index step, before calling git-am --resolved. This proceeds along it's merry way and creates an empty commit. Is this the expected correct behavior or should git-am complain about a situation like that? Eric ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: FYI: git-am allows creation of empty commits. 2006-02-23 15:33 FYI: git-am allows creation of empty commits Eric W. Biederman @ 2006-02-24 5:56 ` Junio C Hamano 2006-02-24 11:24 ` Eric W. Biederman 0 siblings, 1 reply; 8+ messages in thread From: Junio C Hamano @ 2006-02-24 5:56 UTC (permalink / raw) To: Eric W. Biederman; +Cc: git ebiederm@xmission.com (Eric W. Biederman) writes: > After fixing it up and doing all of my edits I occasionally forget > the git-update-index step, before calling git-am --resolved. This > proceeds along it's merry way and creates an empty commit. Certainly a safty measure is missing here. Thanks for noticing. How about something like this? --- diff --git a/git-am.sh b/git-am.sh index 85ecada..6730813 100755 --- a/git-am.sh +++ b/git-am.sh @@ -300,10 +300,16 @@ do } >"$dotest/final-commit" ;; *) - case "$resolved,$interactive" in - tt) - # This is used only for interactive view option. + case "$resolved" in + t) + # This is used for interactive view option, but + # also we should see if the user really did + # something... git-diff-index -p --cached HEAD >"$dotest/patch" + test -s "$dotest/patch" || { + echo "You said resolved, but there is no change in the index..." + stop_here $this + } ;; esac esac ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: FYI: git-am allows creation of empty commits. 2006-02-24 5:56 ` Junio C Hamano @ 2006-02-24 11:24 ` Eric W. Biederman 2006-02-24 12:04 ` Junio C Hamano 0 siblings, 1 reply; 8+ messages in thread From: Eric W. Biederman @ 2006-02-24 11:24 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano <junkio@cox.net> writes: > ebiederm@xmission.com (Eric W. Biederman) writes: > >> After fixing it up and doing all of my edits I occasionally forget >> the git-update-index step, before calling git-am --resolved. This >> proceeds along it's merry way and creates an empty commit. > > Certainly a safty measure is missing here. Thanks for > noticing. How about something like this? Just tested it the patch works, at least in my simple contrived example :) Is this something that we always want to test for in the porcelain or do we want to move a check into git-commit-tree? For getting a reasonable error message where you have the test seems to be the only sane place, but having the check deeper down would be more likely to catch this kind of thing. Eric ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: FYI: git-am allows creation of empty commits. 2006-02-24 11:24 ` Eric W. Biederman @ 2006-02-24 12:04 ` Junio C Hamano 2006-02-24 12:20 ` [PATCH] commit-tree: disallow an empty single-parent commit Junio C Hamano 2006-02-24 13:19 ` FYI: git-am allows creation of empty commits Eric Wong 0 siblings, 2 replies; 8+ messages in thread From: Junio C Hamano @ 2006-02-24 12:04 UTC (permalink / raw) To: Eric W. Biederman; +Cc: git ebiederm@xmission.com (Eric W. Biederman) writes: > Is this something that we always want to test for in the porcelain > or do we want to move a check into git-commit-tree? > > For getting a reasonable error message where you have the test > seems to be the only sane place, but having the check deeper > down would be more likely to catch this kind of thing. I think 99.9% of the time it is a mistake if a single-parented commit has the same tree as its parent commit has, so having a check in commit-tree may not be a bad idea. If you want to do it, however, you need to be a bit careful about merges. In a multi-parented commit, it is legitimate if the merge result exactly match one of the parents (in fact "git-merge -s ours" can be used to create a merge that matches its first parent). The commit-tree program is one of the oldest part of the system, and as a mechanism, does not set nor enforce policies like this. It has been more liberal than the best current practice, such as (1) don't do single-parent empty commit; (2) don't list the same parent twice. The second one was introduced in mid-June last year, which is "long after it was invented" in git timescale. On the other hand, it is more anal than it could be. It does not take a tag that points to a commit to its -p parameter. That's because we did not have tag objects in the beginning, and by the time tags were introduced, nobody ran commit-tree by hand anymore. -- >8 -- [PATCH] commit-tree: disallow an empty single-parent commit. Also allow "git-commit-tree -p v2.6.16-rc2", instead of having to say "git-commit-tree -p v2.6.16-rc2^0". Signed-off-by: Junio C Hamano <junkio@cox.net> --- diff --git a/commit-tree.c b/commit-tree.c index 88871b0..14a7552 100644 --- a/commit-tree.c +++ b/commit-tree.c @@ -45,12 +45,14 @@ static void check_valid(unsigned char *s { void *buf; char type[20]; + unsigned char real_sha1[20]; unsigned long size; - buf = read_sha1_file(sha1, type, &size); - if (!buf || strcmp(type, expect)) + buf = read_object_with_reference(sha1, expect, &size, real_sha1); + if (!buf) die("%s is not a valid '%s' object", sha1_to_hex(sha1), expect); free(buf); + memcpy(sha1, real_sha1, 20); } /* @@ -75,6 +77,19 @@ static int new_parent(int idx) return 1; } +static int check_empty_commit(const unsigned char *tree_sha1, + const unsigned char *parent_sha1) +{ + unsigned char sha1[20]; + char refit[50]; + sprintf(refit, "%s^{tree}", sha1_to_hex(parent_sha1)); + if (get_sha1(refit, sha1)) + die("cannot determine tree in parent commit."); + if (!memcmp(sha1, tree_sha1, 20)) + return error ("empty commit? aborting."); + return 0; +} + int main(int argc, char **argv) { int i; @@ -105,6 +120,9 @@ int main(int argc, char **argv) } if (!parents) fprintf(stderr, "Committing initial tree %s\n", argv[1]); + if (parents == 1) + if (check_empty_commit(tree_sha1, parent_sha1[0])) + exit(1); init_buffer(&buffer, &size); add_buffer(&buffer, &size, "tree %s\n", sha1_to_hex(tree_sha1)); ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH] commit-tree: disallow an empty single-parent commit. 2006-02-24 12:04 ` Junio C Hamano @ 2006-02-24 12:20 ` Junio C Hamano 2006-02-24 12:58 ` Eric W. Biederman 2006-02-24 13:19 ` FYI: git-am allows creation of empty commits Eric Wong 1 sibling, 1 reply; 8+ messages in thread From: Junio C Hamano @ 2006-02-24 12:20 UTC (permalink / raw) To: Eric W. Biederman; +Cc: git Allow "git-commit-tree v2.6.15^{tree} -p HEAD", instead of requiring "git-commit-tree `git rev-parse v2.6.15^{tree}` -p HEAD". The parent parameter that follows -p uses get_sha1() to understand the extended notation, and there is little reason not to allow it for the tree object name parameter. Also make the check_valid() function simpler. This function which predates sha1_object_info() so it had to do things by hand but there is no reason to read the data just to discard anymore. Signed-off-by: Junio C Hamano <junkio@cox.net> --- * Replacement patch. Very lightly tested. commit-tree.c | 27 ++++++++++++++++++++------- 1 files changed, 20 insertions(+), 7 deletions(-) 8f97300b2580b43905ce11eef21e77c5e8e809a6 diff --git a/commit-tree.c b/commit-tree.c index 88871b0..b1d816c 100644 --- a/commit-tree.c +++ b/commit-tree.c @@ -43,14 +43,11 @@ static void add_buffer(char **bufp, unsi static void check_valid(unsigned char *sha1, const char *expect) { - void *buf; char type[20]; - unsigned long size; - buf = read_sha1_file(sha1, type, &size); - if (!buf || strcmp(type, expect)) - die("%s is not a valid '%s' object", sha1_to_hex(sha1), expect); - free(buf); + if (sha1_object_info(sha1, type, NULL) || strcmp(type, expect)) + die("%s is not a valid '%s' object", + sha1_to_hex(sha1), expect); } /* @@ -75,6 +72,19 @@ static int new_parent(int idx) return 1; } +static int check_empty_commit(const unsigned char *tree_sha1, + const unsigned char *parent_sha1) +{ + unsigned char sha1[20]; + char refit[50]; + sprintf(refit, "%s^{tree}", sha1_to_hex(parent_sha1)); + if (get_sha1(refit, sha1)) + die("cannot determine tree in parent commit."); + if (!memcmp(sha1, tree_sha1, 20)) + return error ("empty commit? aborting."); + return 0; +} + int main(int argc, char **argv) { int i; @@ -90,7 +100,7 @@ int main(int argc, char **argv) git_config(git_default_config); - if (argc < 2 || get_sha1_hex(argv[1], tree_sha1) < 0) + if (argc < 2 || get_sha1(argv[1], tree_sha1) < 0) usage(commit_tree_usage); check_valid(tree_sha1, "tree"); @@ -105,6 +115,9 @@ int main(int argc, char **argv) } if (!parents) fprintf(stderr, "Committing initial tree %s\n", argv[1]); + if (parents == 1) + if (check_empty_commit(tree_sha1, parent_sha1[0])) + exit(1); init_buffer(&buffer, &size); add_buffer(&buffer, &size, "tree %s\n", sha1_to_hex(tree_sha1)); -- 1.2.3.g7465 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] commit-tree: disallow an empty single-parent commit. 2006-02-24 12:20 ` [PATCH] commit-tree: disallow an empty single-parent commit Junio C Hamano @ 2006-02-24 12:58 ` Eric W. Biederman 0 siblings, 0 replies; 8+ messages in thread From: Eric W. Biederman @ 2006-02-24 12:58 UTC (permalink / raw) To: Junio C Hamano; +Cc: Eric W. Biederman, git Junio C Hamano <junkio@cox.net> writes: > Allow "git-commit-tree v2.6.15^{tree} -p HEAD", instead of > requiring "git-commit-tree `git rev-parse v2.6.15^{tree}` -p > HEAD". The parent parameter that follows -p uses get_sha1() to > understand the extended notation, and there is little reason not > to allow it for the tree object name parameter. > > Also make the check_valid() function simpler. This function > which predates sha1_object_info() so it had to do things by hand > but there is no reason to read the data just to discard anymore. > > Signed-off-by: Junio C Hamano <junkio@cox.net> Looks good to me. The logic at least looks complete. Eric ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: FYI: git-am allows creation of empty commits. 2006-02-24 12:04 ` Junio C Hamano 2006-02-24 12:20 ` [PATCH] commit-tree: disallow an empty single-parent commit Junio C Hamano @ 2006-02-24 13:19 ` Eric Wong 2006-02-25 6:04 ` Junio C Hamano 1 sibling, 1 reply; 8+ messages in thread From: Eric Wong @ 2006-02-24 13:19 UTC (permalink / raw) To: Junio C Hamano; +Cc: Eric W. Biederman, git, Martin Langhoff, Matthias Urlichs Junio C Hamano <junkio@cox.net> wrote: > ebiederm@xmission.com (Eric W. Biederman) writes: > > > Is this something that we always want to test for in the porcelain > > or do we want to move a check into git-commit-tree? > > > > For getting a reasonable error message where you have the test > > seems to be the only sane place, but having the check deeper > > down would be more likely to catch this kind of thing. > > I think 99.9% of the time it is a mistake if a single-parented > commit has the same tree as its parent commit has, so having a > check in commit-tree may not be a bad idea. This would break importers, more than 0.1% I think... Arch definitely allows empty commits for getting log messages in. SVN forbids them from their POV, but they also have things that we can't see when we import (properties like: mime, externals, eol-style) causing us to write the same tree twice. Not sure about CVS... Maybe a flag such as --force could be added. -- Eric Wong ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: FYI: git-am allows creation of empty commits. 2006-02-24 13:19 ` FYI: git-am allows creation of empty commits Eric Wong @ 2006-02-25 6:04 ` Junio C Hamano 0 siblings, 0 replies; 8+ messages in thread From: Junio C Hamano @ 2006-02-25 6:04 UTC (permalink / raw) To: Eric Wong; +Cc: Eric W. Biederman, git, Martin Langhoff, Matthias Urlichs Eric Wong <normalperson@yhbt.net> writes: >> I think 99.9% of the time it is a mistake if a single-parented >> commit has the same tree as its parent commit has, so having a >> check in commit-tree may not be a bad idea. > > This would break importers, more than 0.1% I think... Arch > definitely allows empty commits for getting log messages in. > SVN forbids them from their POV, but they also have things > that we can't see when we import (properties like: mime, > externals, eol-style) causing us to write the same tree twice. > Not sure about CVS... > > Maybe a flag such as --force could be added. Good point perhaps. Maybe an explicit --no-empty should ask for it, and git-am should use it. As to git-commit I am unsure. In the meantime I'd drop the patch. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2006-02-25 6:04 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-02-23 15:33 FYI: git-am allows creation of empty commits Eric W. Biederman 2006-02-24 5:56 ` Junio C Hamano 2006-02-24 11:24 ` Eric W. Biederman 2006-02-24 12:04 ` Junio C Hamano 2006-02-24 12:20 ` [PATCH] commit-tree: disallow an empty single-parent commit Junio C Hamano 2006-02-24 12:58 ` Eric W. Biederman 2006-02-24 13:19 ` FYI: git-am allows creation of empty commits Eric Wong 2006-02-25 6:04 ` Junio C Hamano
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).