git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / mirror / code / Atom feed
blob 21598a523835146bc18eadfdfc19fce0226df178 3056 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
 
#include "builtin.h"
#include "parse-options.h"
#include "merge-strategies.h"
#include "run-command.h"

struct mofs_data {
	const char *program;
};

static int merge_one_file(struct index_state *istate,
			  const struct object_id *orig_blob,
			  const struct object_id *our_blob,
			  const struct object_id *their_blob, const char *path,
			  unsigned int orig_mode, unsigned int our_mode,
			  unsigned int their_mode, void *data)
{
	struct mofs_data *d = data;
	const char *pgm = d->program;
	const char *arguments[] = { pgm, "", "", "", path, "", "", "", NULL };
	char hexbuf[4][GIT_MAX_HEXSZ + 1];
	char ownbuf[4][60];
	int stage = 0;
	struct child_process cmd = CHILD_PROCESS_INIT;

#define ADD_MOF_ARG(oid, mode) \
	if ((oid)) { \
		stage++; \
		oid_to_hex_r(hexbuf[stage], (oid)); \
		xsnprintf(ownbuf[stage], sizeof(ownbuf[stage]), "%06o", (mode)); \
		arguments[stage] = hexbuf[stage]; \
		arguments[stage + 4] = ownbuf[stage]; \
	}

	ADD_MOF_ARG(orig_blob, orig_mode);
	ADD_MOF_ARG(our_blob, our_mode);
	ADD_MOF_ARG(their_blob, their_mode);

	strvec_pushv(&cmd.args, arguments);
	return run_command(&cmd);
}

int cmd_merge_index(int argc, const char **argv, const char *prefix)
{
	int err = 0;
	int all = 0;
	int one_shot = 0;
	int quiet = 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
	struct mofs_data data = { 0 };

	/* 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);
	data.program = 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)
		err |= merge_all_index(the_repository->index, one_shot, quiet,
				       merge_one_file, &data);
	else
		for (size_t i = 0; i < argc; i++)
			err |= merge_index_path(the_repository->index,
						one_shot, quiet, argv[i],
						merge_one_file, &data);

	return err;
}

debug log:

solving 21598a52383 ...
found 21598a52383 in https://public-inbox.org/git/patch-v9-10.12-c7a131a9a86-20221118T110058Z-avarab@gmail.com/ ||
	https://public-inbox.org/git/patch-v10-10.12-0efc5039e46-20221215T084803Z-avarab@gmail.com/
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/7] 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/7] 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/7] 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/7] 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/7] 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/7] 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

applying [7/7] https://public-inbox.org/git/patch-v9-10.12-c7a131a9a86-20221118T110058Z-avarab@gmail.com/
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index c269d76cc8f..21598a52383 100644

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

skipping https://public-inbox.org/git/patch-v10-10.12-0efc5039e46-20221215T084803Z-avarab@gmail.com/ for 21598a52383
index at:
100644 21598a523835146bc18eadfdfc19fce0226df178	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).