* [PATCH] apply: get rid of --index-info in favor of --build-fake-ancestor
@ 2007-09-17 22:34 Johannes Schindelin
2007-09-17 22:42 ` Junio C Hamano
0 siblings, 1 reply; 4+ messages in thread
From: Johannes Schindelin @ 2007-09-17 22:34 UTC (permalink / raw)
To: gitster, git
git-am used "git apply -z --index-info" to find the original versions
of the files touched by the diff, to be able to do an inexpensive
three-way merge.
This operation makes only sense in a repository, since the index
information in the diff refers to blobs, which have to be present in
the current repository.
Therefore, teach "git apply" a mode to write out the result as an
index file to begin with, obviating the need for scripts to do it
themselves.
The primary user for --index-info is "git am", which is converted to
use --build-fake-ancestor in this patch.
Suggested by Junio.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
Suggested by Junio, but the errors are all mine.
I am not quite certain, though, if there is really no porcelain
using that option. It has been around since Oct 7 2005 (!), so
there is a real chance that StGit, guilt or QGit use it. In that
case, this patch is obviously wrong.
Documentation/git-apply.txt | 11 +++++++----
builtin-apply.c | 35 ++++++++++++++++++++++-------------
git-am.sh | 6 ++----
3 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt
index 4c7e3a2..c1c54bf 100644
--- a/Documentation/git-apply.txt
+++ b/Documentation/git-apply.txt
@@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git-apply' [--stat] [--numstat] [--summary] [--check] [--index]
- [--apply] [--no-add] [--index-info] [-R | --reverse]
+ [--apply] [--no-add] [--build-fake-ancestor <file>] [-R | --reverse]
[--allow-binary-replacement | --binary] [--reject] [-z]
[-pNUM] [-CNUM] [--inaccurate-eof] [--cached]
[--whitespace=<nowarn|warn|error|error-all|strip>]
@@ -63,12 +63,15 @@ OPTIONS
cached data, apply the patch, and store the result in the index,
without using the working tree. This implies '--index'.
---index-info::
+--build-fake-ancestor <file>::
Newer git-diff output has embedded 'index information'
for each blob to help identify the original version that
the patch applies to. When this flag is given, and if
- the original version of the blob is available locally,
- outputs information about them to the standard output.
+ the original versions of the blobs is available locally,
+ builds a temporary index containing those blobs.
++
+When a pure mode change is encountered (which has no index information),
+the information is read from the current index instead.
-R, --reverse::
Apply the patch in reverse.
diff --git a/builtin-apply.c b/builtin-apply.c
index 938fd61..1372169 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -42,7 +42,7 @@ static int apply_in_reverse;
static int apply_with_reject;
static int apply_verbosely;
static int no_add;
-static int show_index_info;
+static const char *fake_ancestor;
static int line_termination = '\n';
static unsigned long p_context = ULONG_MAX;
static const char apply_usage[] =
@@ -2236,9 +2236,12 @@ static int get_current_sha1(const char *path, unsigned char *sha1)
return 0;
}
-static void show_index_list(struct patch *list)
+/* Build an index that contains the just the files needed for a 3way merge */
+static void build_fake_ancestor(struct patch *list, const char *filename)
{
struct patch *patch;
+ struct index_state result = { 0 };
+ int fd;
/* Once we start supporting the reverse patch, it may be
* worth showing the new sha1 prefix, but until then...
@@ -2246,11 +2249,12 @@ static void show_index_list(struct patch *list)
for (patch = list; patch; patch = patch->next) {
const unsigned char *sha1_ptr;
unsigned char sha1[20];
+ struct cache_entry *ce;
const char *name;
name = patch->old_name ? patch->old_name : patch->new_name;
if (0 < patch->is_new)
- sha1_ptr = null_sha1;
+ continue;
else if (get_sha1(patch->old_sha1_prefix, sha1))
/* git diff has no index line for mode/type changes */
if (!patch->lines_added && !patch->lines_deleted) {
@@ -2265,13 +2269,16 @@ static void show_index_list(struct patch *list)
else
sha1_ptr = sha1;
- printf("%06o %s ",patch->old_mode, sha1_to_hex(sha1_ptr));
- if (line_termination && quote_c_style(name, NULL, NULL, 0))
- quote_c_style(name, NULL, stdout, 0);
- else
- fputs(name, stdout);
- putchar(line_termination);
+ ce = make_cache_entry(patch->old_mode, sha1_ptr, name, 0, 0);
+ if (add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD))
+ die ("Could not add %s to temporary index", name);
}
+
+ fd = open(filename, O_WRONLY | O_CREAT, 0666);
+ if (fd < 0 || write_index(&result, fd) || close(fd))
+ die ("Could not write temporary index to %s", filename);
+
+ discard_index(&result);
}
static void stat_patch_list(struct patch *patch)
@@ -2791,8 +2798,8 @@ static int apply_patch(int fd, const char *filename, int inaccurate_eof)
if (apply && write_out_results(list, skipped_patch))
exit(1);
- if (show_index_info)
- show_index_list(list);
+ if (fake_ancestor)
+ build_fake_ancestor(list, fake_ancestor);
if (diffstat)
stat_patch_list(list);
@@ -2900,9 +2907,11 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix)
apply = 1;
continue;
}
- if (!strcmp(arg, "--index-info")) {
+ if (!strcmp(arg, "--build-fake-ancestor")) {
apply = 0;
- show_index_info = 1;
+ if (++i >= argc)
+ die ("need a filename");
+ fake_ancestor = argv[i];
continue;
}
if (!strcmp(arg, "-z")) {
diff --git a/git-am.sh b/git-am.sh
index 4db4701..8340125 100755
--- a/git-am.sh
+++ b/git-am.sh
@@ -62,10 +62,8 @@ fall_back_3way () {
mkdir "$dotest/patch-merge-tmp-dir"
# First see if the patch records the index info that we can use.
- git apply -z --index-info "$dotest/patch" \
- >"$dotest/patch-merge-index-info" &&
- GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
- git update-index -z --index-info <"$dotest/patch-merge-index-info" &&
+ git apply --build-fake-ancestor "$dotest/patch-merge-tmp-index" \
+ "$dotest/patch" &&
GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
git write-tree >"$dotest/patch-merge-base+" ||
cannot_fallback "Repository lacks necessary blobs to fall back on 3-way merge."
--
1.5.3.1.989.g2059
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] apply: get rid of --index-info in favor of --build-fake-ancestor
2007-09-17 22:34 [PATCH] apply: get rid of --index-info in favor of --build-fake-ancestor Johannes Schindelin
@ 2007-09-17 22:42 ` Junio C Hamano
2007-09-17 23:04 ` Johannes Schindelin
0 siblings, 1 reply; 4+ messages in thread
From: Junio C Hamano @ 2007-09-17 22:42 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: gitster, git
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> Suggested by Junio, but the errors are all mine.
>
> I am not quite certain, though, if there is really no porcelain
> using that option. It has been around since Oct 7 2005 (!), so
> there is a real chance that StGit, guilt or QGit use it. In that
> case, this patch is obviously wrong.
You do not have to do the deprecating/removing part if that is
the issue.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] apply: get rid of --index-info in favor of --build-fake-ancestor
2007-09-17 22:42 ` Junio C Hamano
@ 2007-09-17 23:04 ` Johannes Schindelin
2007-09-18 0:18 ` Junio C Hamano
0 siblings, 1 reply; 4+ messages in thread
From: Johannes Schindelin @ 2007-09-17 23:04 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Hi,
On Mon, 17 Sep 2007, Junio C Hamano wrote:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
>
> > Suggested by Junio, but the errors are all mine.
> >
> > I am not quite certain, though, if there is really no porcelain
> > using that option. It has been around since Oct 7 2005 (!), so
> > there is a real chance that StGit, guilt or QGit use it. In that
> > case, this patch is obviously wrong.
>
> You do not have to do the deprecating/removing part if that is
> the issue.
I'd rather avoid keeping this code, if nobody uses it anyway...
So I cloned StGit and guilt (the two porcelains that I feel are most used,
apart from what is in git.git, and I'm too lazy to find that mail
analysing the recent Git survey). Neither of them has any --index-info in
their complete history.
So I'm more confident now that there is no need to keep --index-info.
Ciao,
Dscho
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] apply: get rid of --index-info in favor of --build-fake-ancestor
2007-09-17 23:04 ` Johannes Schindelin
@ 2007-09-18 0:18 ` Junio C Hamano
0 siblings, 0 replies; 4+ messages in thread
From: Junio C Hamano @ 2007-09-18 0:18 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> Hi,
>
> On Mon, 17 Sep 2007, Junio C Hamano wrote:
>
>> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
>>
>> > Suggested by Junio, but the errors are all mine.
>> >
>> > I am not quite certain, though, if there is really no porcelain
>> > using that option. It has been around since Oct 7 2005 (!), so
>> > there is a real chance that StGit, guilt or QGit use it. In that
>> > case, this patch is obviously wrong.
>>
>> You do not have to do the deprecating/removing part if that is
>> the issue.
>
> I'd rather avoid keeping this code, if nobody uses it anyway...
>
> So I cloned StGit and guilt (the two porcelains that I feel are most used,
> apart from what is in git.git, and I'm too lazy to find that mail
> analysing the recent Git survey). Neither of them has any --index-info in
> their complete history.
>
> So I'm more confident now that there is no need to keep --index-info.
Ok, fair enough.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-09-18 0:19 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-09-17 22:34 [PATCH] apply: get rid of --index-info in favor of --build-fake-ancestor Johannes Schindelin
2007-09-17 22:42 ` Junio C Hamano
2007-09-17 23:04 ` Johannes Schindelin
2007-09-18 0:18 ` Junio C Hamano
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).