From: Sergey Vlasov <vsu@altlinux.ru>
To: Daniel Barkalow <barkalow@iabervon.org>
Cc: Junio C Hamano <junkio@cox.net>, git@vger.kernel.org
Subject: Re: [PATCH] Fix fetch completeness assumptions
Date: Thu, 15 Sep 2005 15:02:05 +0400 [thread overview]
Message-ID: <20050915150205.65378a65.vsu@altlinux.ru> (raw)
In-Reply-To: <Pine.LNX.4.63.0509142120020.23242@iabervon.org>
[-- Attachment #1: Type: text/plain, Size: 3637 bytes --]
On Wed, 14 Sep 2005 21:31:42 -0400 (EDT) Daniel Barkalow wrote:
> Don't assume that any commit we have is complete; assume that any ref
> we have is complete.
>
> Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
>
> ---
> Only lightly tested, but it seems to work. Marks all of the commits in
> refs, and their ancestors back as far as the date of the commit it's
> processing. If the commit it's processing is marked, it doesn't recurse
> into it.
Seems to work here too (however, previous playing with git-fetch and
old git-http-fetch left .git/refs/heads/origin.remote pointing to an
incomplete commit, and this greatly confused the new git-http-fetch).
Junio, probably you can throw away my patches adding --recover (also I
forgot to add Signed-off-by for them...) - the automatic recovery
provided by this patch is better. Still there is some room for
improvement...
> This should make it very difficult to get it to produce a situation where
> it completes without giving you complete information, and it shouldn't
> process commits that are accessible from refs.
>
> fetch.c | 28 ++++++++++++++++++++++++++--
> 1 files changed, 26 insertions(+), 2 deletions(-)
>
> 39216139abc4f2759f7b55d11fa2f7e7c155898c
> diff --git a/fetch.c b/fetch.c
> --- a/fetch.c
> +++ b/fetch.c
> @@ -62,11 +62,21 @@ static int process_tree(struct tree *tre
> return 0;
> }
>
> +struct commit_list *complete = NULL;
static
> +
> static int process_commit(struct commit *commit)
> {
> if (parse_commit(commit))
> return -1;
>
> + while (complete && complete->item->date >= commit->date) {
> + pop_most_recent_commit(&complete, 1);
> + }
> +
> +
> + if (commit->object.flags & 1)
> + return 0;
Hmm, I would define some constant for this flag at the top of file:
/* Object flags */
#define COMPLETE (1U << 0)
Otherwise it is hard to see what object flags are used in the code
(only one flag is used currently, but we may need more in the future).
> +
> memcpy(current_commit_sha1, commit->object.sha1, 20);
>
> if (get_tree) {
> @@ -78,8 +88,6 @@ static int process_commit(struct commit
> if (get_history) {
> struct commit_list *parents = commit->parents;
> for (; parents; parents = parents->next) {
> - if (has_sha1_file(parents->item->object.sha1))
> - continue;
> if (process(parents->item->object.sha1,
> commit_type))
> return -1;
> @@ -126,6 +134,7 @@ static int process_object(struct object
> static int process(unsigned char *sha1, const char *type)
> {
> struct object *obj = lookup_object_type(sha1, type);
> +
> if (has_sha1_file(sha1)) {
> parse_object(sha1);
> /* We already have it, so we should scan it now. */
> @@ -179,6 +188,19 @@ static int interpret_target(char *target
> return -1;
> }
>
> +static int mark_complete(const char *path, const unsigned char *sha1)
> +{
> + struct object *obj = parse_object(sha1);
> + while (obj->type == tag_type) {
> + obj = ((struct tag *) obj)->tagged;
> + parse_object(obj->sha1);
> + }
> + if (obj->type == commit_type) {
> + obj->flags |= 1;
> + insert_by_date((struct commit *) obj, &complete);
> + }
Dereferencing of tags is already implemented:
struct commit *commit = lookup_commit_reference_gently(sha1, 1);
if (commit) {
commit->object.flags |= 1;
insert_by_date(commit, &complete);
}
> + return 0;
> +}
>
> int pull(char *target)
> {
> @@ -191,6 +213,8 @@ int pull(char *target)
> return -1;
> }
>
> + for_each_ref(mark_complete);
> +
> if (interpret_target(target, sha1))
> return error("Could not interpret %s as something to pull",
> target);
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
next prev parent reply other threads:[~2005-09-15 11:02 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-15 1:31 [PATCH] Fix fetch completeness assumptions Daniel Barkalow
2005-09-15 8:09 ` Junio C Hamano
2005-09-15 16:42 ` Daniel Barkalow
2005-09-15 11:02 ` Sergey Vlasov [this message]
2005-09-15 16:54 ` Daniel Barkalow
2005-09-16 6:04 ` Junio C Hamano
2005-09-17 8:02 ` Junio C Hamano
2005-09-17 8:32 ` Junio C Hamano
2005-09-17 8:50 ` Help cloning over http Junio C Hamano
2005-09-17 17:37 ` Daniel Barkalow
2005-09-18 17:38 ` [PATCH] Improve the safety check used in fetch.c Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050915150205.65378a65.vsu@altlinux.ru \
--to=vsu@altlinux.ru \
--cc=barkalow@iabervon.org \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).