From 734c91f9e292cf6ed1401c178bc9fbb902cc82dd Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 5 Mar 2007 12:31:09 -0500 Subject: [PATCH 1/5] fast-import: Avoid infinite loop after reset Johannes Sixt noticed that a 'reset' command applied to a branch that is already active in the branch LRU cache can cause fast-import to relink the same branch into the LRU cache twice. This will cause the LRU cache to contain a cycle, making unload_one_branch run in an infinite loop as it tries to select the oldest branch for eviction. I have trivially fixed the problem by adding an active bit to each branch object; this bit indicates if the branch is already in the LRU and allows us to avoid trying to add it a second time. Converting the pack_id field into a bitfield makes this change take up no additional memory. Signed-off-by: Shawn O. Pearce --- fast-import.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/fast-import.c b/fast-import.c index 1ae125a040..490f640036 100644 --- a/fast-import.c +++ b/fast-import.c @@ -220,7 +220,8 @@ struct branch const char *name; struct tree_entry branch_tree; uintmax_t last_commit; - unsigned int pack_id; + unsigned active : 1; + unsigned pack_id : PACK_ID_BITS; unsigned char sha1[20]; }; @@ -528,6 +529,7 @@ static struct branch *new_branch(const char *name) b->table_next_branch = branch_table[hc]; b->branch_tree.versions[0].mode = S_IFDIR; b->branch_tree.versions[1].mode = S_IFDIR; + b->active = 0; b->pack_id = MAX_PACK_ID; branch_table[hc] = b; branch_count++; @@ -1547,6 +1549,7 @@ static void unload_one_branch(void) e = active_branches; active_branches = e->active_next_branch; } + e->active = 0; e->active_next_branch = NULL; if (e->branch_tree.tree) { release_tree_content_recursive(e->branch_tree.tree); @@ -1559,10 +1562,13 @@ static void unload_one_branch(void) static void load_branch(struct branch *b) { load_tree(&b->branch_tree); - b->active_next_branch = active_branches; - active_branches = b; - cur_active_branches++; - branch_load_count++; + if (!b->active) { + b->active = 1; + b->active_next_branch = active_branches; + active_branches = b; + cur_active_branches++; + branch_load_count++; + } } static void file_change_m(struct branch *b) From 2f6dc35d2ad0bd2a8648902a692f087f47d1ee86 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 5 Mar 2007 12:43:14 -0500 Subject: [PATCH 2/5] fast-import: Fail if a non-existant commit is used for merge Johannes Sixt noticed during one of his own imports that fast-import did not fail if a non-existant commit is referenced by SHA-1 value as an argument to the 'merge' command. This allowed the user to unknowingly create commits that would fail in fsck, as the commit contents would not be completely reachable. A side effect of this bug was that a frontend process could mark any SHA-1 object (blob, tree, tag) as a parent of a merge commit. This should also fail in fsck, as the commit is not a valid commit. We now use the same rule as the 'from' command. If a commit is referenced in the 'merge' command by hex formatted SHA-1 then the SHA-1 must be a commit or a tag that can be peeled back to a commit, the commit must already exist, and must be readable by the core Git infrastructure code. This requirement means that the commit must have existed prior to fast-import starting, or the commit must have been flushed out by a prior 'checkpoint' command. Signed-off-by: Shawn O. Pearce --- fast-import.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fast-import.c b/fast-import.c index 490f640036..d9492b9884 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1752,7 +1752,14 @@ static struct hash_list *cmd_merge(unsigned int *count) if (oe->type != OBJ_COMMIT) die("Mark :%" PRIuMAX " not a commit", idnum); hashcpy(n->sha1, oe->sha1); - } else if (get_sha1(from, n->sha1)) + } else if (!get_sha1(from, n->sha1)) { + unsigned long size; + char *buf = read_object_with_reference(n->sha1, + type_names[OBJ_COMMIT], &size, n->sha1); + if (!buf || size < 46) + die("Not a valid commit: %s", from); + free(buf); + } else die("Invalid ref name or SHA1 expression: %s", from); n->next = NULL; From 56333bac66ccdefa3f6d67f78da9f5267119c4a6 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 5 Mar 2007 16:37:54 +0100 Subject: [PATCH 3/5] Begin SubmittingPatches with a check list It seems that some people prefer a short list to a long text. But even for the latter group, a quick reminder list is useful. So, add a check list to Documentation/SubmittingPatches of what to do to get your patch accepted. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- Documentation/SubmittingPatches | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index 285781d9db..131bcff9b2 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -1,3 +1,30 @@ +Checklist (and a short version for the impatient): + + - make commits of logical units + - check for unnecessary whitespace with "git diff --check" + before committing + - do not check in commented out code or unneeded files + - provide a meaningful commit message + - the first line of the commit message should be a short + description and should skip the full stop + - if you want your work included in git.git, add a + "Signed-off-by: Your Name " line to the + commit message (or just use the option "-s" when + committing) to confirm that you agree to the Developer's + Certificate of Origin + - do not PGP sign your patch + - use "git format-patch -M" to create the patch + - do not attach your patch, but read in the mail + body, unless you cannot teach your mailer to + leave the formatting of the patch alone. + - be careful doing cut & paste into your mailer, not to + corrupt whitespaces. + - provide additional information (which is unsuitable for + the commit message) between the "---" and the diffstat + - send the patch to the list _and_ the maintainer + +Long version: + I started reading over the SubmittingPatches document for Linux kernel, primarily because I wanted to have a document similar to it for the core GIT to make sure people understand what they are From 043d76050d3136b8684b5a3938e8bc0c1f8483fd Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Mon, 5 Mar 2007 14:46:05 -0500 Subject: [PATCH 4/5] Add definition of to the main git man page. Signed-off-by: "Theodore Ts'o" Signed-off-by: Junio C Hamano --- Documentation/git.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/git.txt b/Documentation/git.txt index c0fa0d4b17..e514588bd3 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -231,6 +231,12 @@ Identifier Terminology operate on a object but automatically dereferences and objects that point at a . +:: + Indicates a commit or tag object name. A + command that takes a argument ultimately wants to + operate on a object but automatically dereferences + objects that point at a . + :: Indicates that an object type is required. Currently one of: `blob`, `tree`, `commit`, or `tag`. From b8105375abfeee54e0a34e1c290983fd15e743cf Mon Sep 17 00:00:00 2001 From: Brian Gernhardt Date: Mon, 5 Mar 2007 22:27:44 -0500 Subject: [PATCH 5/5] Fix diff-options references in git-diff and git-format-patch Most of the git-diff-* documentation used [] instead of [--diff-options], so make that change in git-diff and git-format-patch. In addition, git-format-patch didn't include the meanings of the diff options. Signed-off-by: Brian Gernhardt Signed-off-by: Junio C Hamano --- Documentation/git-diff.txt | 2 +- Documentation/git-format-patch.txt | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt index 6a098df26b..b88764f45f 100644 --- a/Documentation/git-diff.txt +++ b/Documentation/git-diff.txt @@ -8,7 +8,7 @@ git-diff - Show changes between commits, commit and working tree, etc SYNOPSIS -------- -'git-diff' [ --diff-options ] {0,2} [--] [...] +'git-diff' [] {0,2} [--] [...] DESCRIPTION ----------- diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 59f34b9f0d..84eabebe0b 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -9,8 +9,8 @@ git-format-patch - Prepare patches for e-mail submission SYNOPSIS -------- [verse] -'git-format-patch' [-n | -k] [-o | --stdout] [--attach] [--thread] - [-s | --signoff] [--diff-options] [--start-number ] +'git-format-patch' [] [-n | -k] [-o | --stdout] + [--attach] [--thread] [-s | --signoff] [--start-number ] [--in-reply-to=Message-Id] [--suffix=.] [--ignore-if-in-upstream] [..] @@ -46,6 +46,8 @@ reference. OPTIONS ------- +include::diff-options.txt[] + -o|--output-directory :: Use to store the resulting files, instead of the current working directory.