From: Junio C Hamano <gitster@pobox.com>
To: "Michał Kiedrowicz" <michal.kiedrowicz@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: [PATCH] builtin-apply: keep information about files to be deleted
Date: Mon, 13 Apr 2009 11:51:55 -0700 [thread overview]
Message-ID: <7v4owsfktw.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <1239478260-7420-1-git-send-email-michal.kiedrowicz@gmail.com> (Michał Kiedrowicz's message of "Sat, 11 Apr 2009 21:31:00 +0200")
Michał Kiedrowicz <michal.kiedrowicz@gmail.com> writes:
> diff --git a/builtin-apply.c b/builtin-apply.c
> index 1926cd8..6f6bf85 100644
> --- a/builtin-apply.c
> +++ b/builtin-apply.c
> @@ -2271,6 +2271,16 @@ static struct patch *in_fn_table(const char *name)
> return NULL;
> }
>
> +static int to_be_deleted(struct patch *patch)
> +{
> + return patch == (struct patch *) -2;
> +}
> +
> +static int was_deleted(struct patch *patch)
> +{
> + return patch == (struct patch *) -1;
> +}
Please use more descriptive symbolic constants, and add a comment.
Perhaps:
/*
* item->util in the filename table records the status of the path.
* Usually it points at a patch (whose result records the contents
* of it after applying it), but it could be PATH_WAS_DELETED for a
* path that a previously applied patch has already removed.
*/
#define PATH_TO_BE_DELETED ((struct patch *) -2)
#define PATH_WAS_DELETED ((struct patch *) -1)
> @@ -2295,6 +2305,24 @@ static void add_to_fn_table(struct patch *patch)
> ...
> +static void prepare_fn_table(struct patch *patch)
> +{
> + /*
> + * store information about incoming file deletion
> + */
> + while (patch) {
> + if ((patch->new_name == NULL) || (patch->is_rename)) {
> + struct string_list_item *item =
> + string_list_insert(patch->old_name, &fn_table);
> + item->util = (struct patch *) -2;
> + }
> + patch = patch->next;
> + }
> +}
This PATH_TO_BE_DELETED logic should be Ok for the normal case, but it
seems a bit fragile. In a sequence of patches, if you have even one patch
that makes the path disappear, you initialize it as PATH_TO_BE_DELETED,
and special case the "creation should not clobber existing path" rule to
allow it to be present in the tree.
That may make this sequence work, I presume, with your change:
patch #1 renames frotz.c to hello.c
patch #2 renames hello.c to frotz.c
because of patch #2, hello.c is marked as PATH_TO_BE_DELETED initially and
then when patch #1 is handled, frotz.c is allowed to replace it.
But if you have further patches that do the following (the "file table"
mechanism was added to handle concatenated patches that affect the same
path more than once), I thing PATH_TO_BE_DELETED logic would break down:
patch #3 renames alpha.c to hello.c
patch #4 renames hello.c to alpha.c
When patch #3 is handled, the PATH_TO_BE_DELETED mark is long gone from
hello.c, and we will see the same failure you addressed in your patch,
won't we?
The prepare_fn_table() may be a good place to diagnose such a situation
and warn or error out if the user feeds such an input we cannot handle
sanely.
> @@ -2410,6 +2438,8 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
> return error("%s: %s", old_name, strerror(errno));
> }
>
> + if(to_be_deleted(tpatch)) tpatch = NULL;
> +
Style;
if (to_be_deleted(tpatch))
tpatch = NULL;
Other than that, I think it is a sensible approach.
next prev parent reply other threads:[~2009-04-13 18:53 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-11 19:31 [PATCH] builtin-apply: keep information about files to be deleted Michał Kiedrowicz
2009-04-13 13:51 ` Michał Kiedrowicz
2009-04-13 18:51 ` Junio C Hamano [this message]
2009-04-13 21:03 ` Michał Kiedrowicz
2009-04-13 21:30 ` Junio C Hamano
2009-04-17 17:23 ` Michał Kiedrowicz
2009-04-18 4:59 ` Junio C Hamano
2009-04-18 11:27 ` Andreas Ericsson
2009-04-18 19:56 ` Junio C Hamano
2009-04-18 20:58 ` Michał Kiedrowicz
2009-04-18 21:03 ` [PATCH] tests: make test-apply-criss-cross-rename more robust Michał Kiedrowicz
2009-04-18 22:05 ` [PATCH] builtin-apply: keep information about files to be deleted 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=7v4owsfktw.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=michal.kiedrowicz@gmail.com \
/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).