git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / mirror / code / Atom feed
blob c269d76cc8f2532f6094e65070d8624955712edb 3411 bytes (raw)
name: builtin/merge-index.c 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 
#include "builtin.h"
#include "parse-options.h"
#include "run-command.h"

static const char *pgm;
static int one_shot, quiet;
static int err;

static int merge_entry(struct index_state *istate, int pos, const char *path)
{
	int found;
	const char *arguments[] = { pgm, "", "", "", path, "", "", "", NULL };
	char hexbuf[4][GIT_MAX_HEXSZ + 1];
	char ownbuf[4][60];
	struct child_process cmd = CHILD_PROCESS_INIT;

	if (pos >= istate->cache_nr)
		die(_("'%s' is not in the cache"), path);
	found = 0;
	do {
		const struct cache_entry *ce = istate->cache[pos];
		int stage = ce_stage(ce);

		if (strcmp(ce->name, path))
			break;
		found++;
		oid_to_hex_r(hexbuf[stage], &ce->oid);
		xsnprintf(ownbuf[stage], sizeof(ownbuf[stage]), "%o", ce->ce_mode);
		arguments[stage] = hexbuf[stage];
		arguments[stage + 4] = ownbuf[stage];
	} while (++pos < istate->cache_nr);
	if (!found)
		die(_("'%s' is not in the cache"), path);

	strvec_pushv(&cmd.args, arguments);
	if (run_command(&cmd)) {
		if (one_shot)
			err++;
		else {
			if (!quiet)
				die(_("merge program failed"));
			exit(1);
		}
	}
	return found;
}

static void merge_one_path(struct index_state *istate, const char *path)
{
	int pos = index_name_pos(istate, path, strlen(path));

	/*
	 * If it already exists in the cache as stage0, it's
	 * already merged and there is nothing to do.
	 */
	if (pos < 0)
		merge_entry(istate, -pos-1, path);
}

static void merge_all(struct index_state *istate)
{
	int i;

	for (i = 0; i < istate->cache_nr; i++) {
		const struct cache_entry *ce = istate->cache[i];
		if (!ce_stage(ce))
			continue;
		i += merge_entry(istate, i, ce->name)-1;
	}
}

int cmd_merge_index(int argc, const char **argv, const char *prefix)
{
	int all = 0;
	const char * const usage[] = {
		N_("git merge-index [-o] [-q] <merge-program> (-a | ([--] <file>...))"),
		NULL
	};
#define OPT__MERGE_INDEX_ALL(v) \
	OPT_BOOL('a', NULL, (v), \
		 N_("merge all files in the index that need merging"))
	struct option options[] = {
		OPT_BOOL('o', NULL, &one_shot,
			 N_("don't stop at the first failed merge")),
		OPT__QUIET(&quiet, N_("be quiet")),
		OPT__MERGE_INDEX_ALL(&all), /* include "-a" to show it in "-bh" */
		OPT_END(),
	};
	struct option options_prog[] = {
		OPT__MERGE_INDEX_ALL(&all),
		OPT_END(),
	};
#undef OPT__MERGE_INDEX_ALL

	/* Without this we cannot rely on waitpid() to tell
	 * what happened to our children.
	 */
	signal(SIGCHLD, SIG_DFL);

	if (argc < 3)
		usage_with_options(usage, options);

	/* Option parsing without <merge-program> options */
	argc = parse_options(argc, argv, prefix, options, usage,
			     PARSE_OPT_STOP_AT_NON_OPTION);
	if (all)
		usage_msg_optf(_("'%s' option can only be provided after '<merge-program>'"),
			      usage, options, "-a");
	/* <merge-program> and its options */
	if (!argc)
		usage_msg_opt(_("need a <merge-program> argument"), usage, options);
	pgm = argv[0];
	argc = parse_options(argc, argv, prefix, options_prog, usage, 0);
	if (argc && all)
		usage_msg_opt(_("'-a' and '<file>...' are mutually exclusive"),
			      usage, options);

	repo_read_index(the_repository);

	/* TODO: audit for interaction with sparse-index. */
	ensure_full_index(the_repository->index);

	if (all)
		merge_all(the_repository->index);
	else
		for (size_t i = 0; i < argc; i++)
			merge_one_path(the_repository->index, argv[i]);

	if (err && !quiet)
		die(_("merge program failed"));
	return err;
}

debug log:

solving c269d76cc8f ...
found c269d76cc8f in https://public-inbox.org/git/patch-v10-09.12-fc9a05ee034-20221215T084803Z-avarab@gmail.com/ ||
	https://public-inbox.org/git/patch-v9-09.12-f29343197eb-20221118T110058Z-avarab@gmail.com/
found cd160779cbf in https://public-inbox.org/git/patch-v10-08.12-45cf7995448-20221215T084803Z-avarab@gmail.com/
found 4d91e7ea122 in https://public-inbox.org/git/patch-v10-07.12-de4d11798db-20221215T084803Z-avarab@gmail.com/
found 2dc789fb787 in https://public-inbox.org/git/patch-v10-06.12-324368401a2-20221215T084803Z-avarab@gmail.com/
found 3855531c579 in https://public-inbox.org/git/patch-v10-05.12-a3f69564ac5-20221215T084803Z-avarab@gmail.com/
found 69b18ed82ac in https://public-inbox.org/git/patch-v10-01.12-9240ab10649-20221215T084803Z-avarab@gmail.com/
found 452f833ac46 in https://80x24.org/mirrors/git.git
preparing index
index prepared:
100644 452f833ac4610121d5194a65087d733e4b66914f	builtin/merge-index.c

applying [1/6] https://public-inbox.org/git/patch-v10-01.12-9240ab10649-20221215T084803Z-avarab@gmail.com/
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index 452f833ac46..69b18ed82ac 100644


applying [2/6] https://public-inbox.org/git/patch-v10-05.12-a3f69564ac5-20221215T084803Z-avarab@gmail.com/
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index 69b18ed82ac..3855531c579 100644


applying [3/6] https://public-inbox.org/git/patch-v10-06.12-324368401a2-20221215T084803Z-avarab@gmail.com/
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index 3855531c579..2dc789fb787 100644


applying [4/6] https://public-inbox.org/git/patch-v10-07.12-de4d11798db-20221215T084803Z-avarab@gmail.com/
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index 2dc789fb787..4d91e7ea122 100644


applying [5/6] https://public-inbox.org/git/patch-v10-08.12-45cf7995448-20221215T084803Z-avarab@gmail.com/
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index 4d91e7ea122..cd160779cbf 100644


applying [6/6] https://public-inbox.org/git/patch-v10-09.12-fc9a05ee034-20221215T084803Z-avarab@gmail.com/
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index cd160779cbf..c269d76cc8f 100644

Checking patch builtin/merge-index.c...
Applied patch builtin/merge-index.c cleanly.
Checking patch builtin/merge-index.c...
Applied patch builtin/merge-index.c cleanly.
Checking patch builtin/merge-index.c...
Applied patch builtin/merge-index.c cleanly.
Checking patch builtin/merge-index.c...
Applied patch builtin/merge-index.c cleanly.
Checking patch builtin/merge-index.c...
Applied patch builtin/merge-index.c cleanly.
Checking patch builtin/merge-index.c...
Applied patch builtin/merge-index.c cleanly.

skipping https://public-inbox.org/git/patch-v9-09.12-f29343197eb-20221118T110058Z-avarab@gmail.com/ for c269d76cc8f
index at:
100644 c269d76cc8f2532f6094e65070d8624955712edb	builtin/merge-index.c

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

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).