54
DISPLAY_FORMAT_UNKNOWN = 0,
55
DISPLAY_FORMAT_FULL,
56
DISPLAY_FORMAT_COMPACT,
57
+ DISPLAY_FORMAT_PORCELAIN,
58
};
59
60
struct display_state {
757
display_state->refcol_width = refcol_width(ref_map,
758
display_state->format == DISPLAY_FORMAT_COMPACT);
759
break;
760
+ case DISPLAY_FORMAT_PORCELAIN:
761
+ /* We don't need to precompute anything here. */
762
+ break;
763
default:
764
BUG("unexpected display format %d", display_state->format);
765
}
830
static void display_ref_update(struct display_state *display_state, char code,
831
const char *summary, const char *error,
832
const char *remote, const char *local,
833
+ const struct object_id *old_oid,
834
+ const struct object_id *new_oid,
835
int summary_width)
836
{
837
+ FILE *f = stderr;
838
+
839
if (verbosity < 0)
840
return;
841
868
869
break;
870
}
871
+ case DISPLAY_FORMAT_PORCELAIN:
872
+ strbuf_addf(&display_state->buf, "%c %s %s %s", code,
873
+ oid_to_hex(old_oid), oid_to_hex(new_oid), local);
874
+ f = stdout;
875
+ break;
876
default:
877
BUG("unexpected display format %d", display_state->format);
878
};
879
strbuf_addch(&display_state->buf, '\n');
880
868
- fputs(display_state->buf.buf, stderr);
881
+ fputs(display_state->buf.buf, f);
882
}
883
884
static int update_local_ref(struct ref *ref,
896
if (oideq(&ref->old_oid, &ref->new_oid)) {
897
if (verbosity > 0)
898
display_ref_update(display_state, '=', _("[up to date]"), NULL,
886
- remote_ref->name, ref->name, summary_width);
899
+ remote_ref->name, ref->name,
900
+ &ref->old_oid, &ref->new_oid, summary_width);
901
return 0;
902
}
903
910
*/
911
display_ref_update(display_state, '!', _("[rejected]"),
912
_("can't fetch into checked-out branch"),
899
- remote_ref->name, ref->name, summary_width);
913
+ remote_ref->name, ref->name,
914
+ &ref->old_oid, &ref->new_oid, summary_width);
915
return 1;
916
}
917
922
r = s_update_ref("updating tag", ref, transaction, 0);
923
display_ref_update(display_state, r ? '!' : 't', _("[tag update]"),
924
r ? _("unable to update local ref") : NULL,
910
- remote_ref->name, ref->name, summary_width);
925
+ remote_ref->name, ref->name,
926
+ &ref->old_oid, &ref->new_oid, summary_width);
927
return r;
928
} else {
929
display_ref_update(display_state, '!', _("[rejected]"),
930
_("would clobber existing tag"),
915
- remote_ref->name, ref->name, summary_width);
931
+ remote_ref->name, ref->name,
932
+ &ref->old_oid, &ref->new_oid, summary_width);
933
return 1;
934
}
935
}
962
r = s_update_ref(msg, ref, transaction, 0);
963
display_ref_update(display_state, r ? '!' : '*', what,
964
r ? _("unable to update local ref") : NULL,
948
- remote_ref->name, ref->name, summary_width);
965
+ remote_ref->name, ref->name,
966
+ &ref->old_oid, &ref->new_oid, summary_width);
967
return r;
968
}
969
986
r = s_update_ref("fast-forward", ref, transaction, 1);
987
display_ref_update(display_state, r ? '!' : ' ', quickref.buf,
988
r ? _("unable to update local ref") : NULL,
971
- remote_ref->name, ref->name, summary_width);
989
+ remote_ref->name, ref->name,
990
+ &ref->old_oid, &ref->new_oid, summary_width);
991
strbuf_release(&quickref);
992
return r;
993
} else if (force || ref->force) {
999
r = s_update_ref("forced-update", ref, transaction, 1);
1000
display_ref_update(display_state, r ? '!' : '+', quickref.buf,
1001
r ? _("unable to update local ref") : _("forced update"),
983
- remote_ref->name, ref->name, summary_width);
1002
+ remote_ref->name, ref->name,
1003
+ &ref->old_oid, &ref->new_oid, summary_width);
1004
strbuf_release(&quickref);
1005
return r;
1006
} else {
1007
display_ref_update(display_state, '!', _("[rejected]"), _("non-fast-forward"),
988
- remote_ref->name, ref->name, summary_width);
1008
+ remote_ref->name, ref->name,
1009
+ &ref->old_oid, &ref->new_oid, summary_width);
1010
return 1;
1011
}
1012
}
1247
display_ref_update(display_state, '*',
1248
*kind ? kind : "branch", NULL,
1249
rm->name,
1229
- "FETCH_HEAD", summary_width);
1250
+ "FETCH_HEAD",
1251
+ &rm->new_oid, &rm->old_oid,
1252
+ summary_width);
1253
}
1254
}
1255
}
1389
for (ref = stale_refs; ref; ref = ref->next) {
1390
display_ref_update(display_state, '-', _("[deleted]"), NULL,
1391
_("(none)"), ref->name,
1392
+ &ref->new_oid, &ref->old_oid,
1393
summary_width);
1394
warn_dangling_symref(stderr, dangling_msg, ref->name);
1395
}
1822
return 1;
1823
}
1824
1801
-static void add_options_to_argv(struct strvec *argv)
1825
+static void add_options_to_argv(struct strvec *argv,
1826
+ enum display_format format)
1827
{
1828
if (dry_run)
1829
strvec_push(argv, "--dry-run");
1859
strvec_push(argv, "--ipv6");
1860
if (!write_fetch_head)
1861
strvec_push(argv, "--no-write-fetch-head");
1862
+ if (format == DISPLAY_FORMAT_PORCELAIN)
1863
+ strvec_pushf(argv, "--porcelain");
1864
}
1865
1866
/* Fetch multiple remotes in parallel */
1869
const char **argv;
1870
struct string_list *remotes;
1871
int next, result;
1872
+ enum display_format format;
1873
};
1874
1875
static int fetch_next_remote(struct child_process *cp,
1889
strvec_push(&cp->args, remote);
1890
cp->git_cmd = 1;
1891
1864
- if (verbosity >= 0)
1892
+ if (verbosity >= 0 && state->format != DISPLAY_FORMAT_PORCELAIN)
1893
printf(_("Fetching %s\n"), remote);
1894
1895
return 1;
1921
return 0;
1922
}
1923
1896
-static int fetch_multiple(struct string_list *list, int max_children)
1924
+static int fetch_multiple(struct string_list *list, int max_children,
1925
+ enum display_format format)
1926
{
1927
int i, result = 0;
1928
struct strvec argv = STRVEC_INIT;
1940
strvec_pushl(&argv, "-c", "fetch.bundleURI=",
1941
"fetch", "--append", "--no-auto-gc",
1942
"--no-write-commit-graph", NULL);
1914
- add_options_to_argv(&argv);
1943
+ add_options_to_argv(&argv, format);
1944
1945
if (max_children != 1 && list->nr != 1) {
1917
- struct parallel_fetch_state state = { argv.v, list, 0, 0 };
1946
+ struct parallel_fetch_state state = { argv.v, list, 0, 0, format };
1947
const struct run_process_parallel_opts opts = {
1948
.tr2_category = "fetch",
1949
.tr2_label = "parallel/fetch",
1967
1968
strvec_pushv(&cmd.args, argv.v);
1969
strvec_push(&cmd.args, name);
1941
- if (verbosity >= 0)
1970
+ if (verbosity >= 0 && format != DISPLAY_FORMAT_PORCELAIN)
1971
printf(_("Fetching %s\n"), name);
1972
cmd.git_cmd = 1;
1973
if (run_command(&cmd)) {
2118
int fetch_write_commit_graph = -1;
2119
int stdin_refspecs = 0;
2120
int negotiate_only = 0;
2121
+ int porcelain = 0;
2122
int i;
2123
2124
struct option builtin_fetch_options[] = {
2153
PARSE_OPT_OPTARG, option_fetch_parse_recurse_submodules),
2154
OPT_BOOL(0, "dry-run", &dry_run,
2155
N_("dry run")),
2156
+ OPT_BOOL(0, "porcelain", &porcelain, N_("machine-readable output")),
2157
OPT_BOOL(0, "write-fetch-head", &write_fetch_head,
2158
N_("write fetched references to the FETCH_HEAD file")),
2159
OPT_BOOL('k', "keep", &keep, N_("keep downloaded pack")),
2259
fetch_config_from_gitmodules(sfjc, rs);
2260
}
2261
2262
+
2263
+ if (porcelain) {
2264
+ switch (recurse_submodules_cli) {
2265
+ case RECURSE_SUBMODULES_OFF:
2266
+ case RECURSE_SUBMODULES_DEFAULT:
2267
+ /*
2268
+ * Reference updates in submodules would be ambiguous
2269
+ * in porcelain mode, so we reject this combination.
2270
+ */
2271
+ recurse_submodules = RECURSE_SUBMODULES_OFF;
2272
+ break;
2273
+
2274
+ default:
2275
+ die(_("options '%s' and '%s' cannot be used together"),
2276
+ "--porcelain", "--recurse-submodules");
2277
+ }
2278
+
2279
+ config.display_format = DISPLAY_FORMAT_PORCELAIN;
2280
+ }
2281
+
2282
if (negotiate_only && !negotiation_tip.nr)
2283
die(_("--negotiate-only needs one or more --negotiation-tip=*"));
2284
2398
max_children = fetch_parallel_config;
2399
2400
/* TODO should this also die if we have a previous partial-clone? */
2350
- result = fetch_multiple(&list, max_children);
2401
+ result = fetch_multiple(&list, max_children, config.display_format);
2402
}
2403
2353
-
2404
/*
2405
* This is only needed after fetch_one(), which does not fetch
2406
* submodules by itself.
2419
if (max_children < 0)
2420
max_children = fetch_parallel_config;
2421
2372
- add_options_to_argv(&options);
2422
+ add_options_to_argv(&options, config.display_format);
2423
result = fetch_submodules(the_repository,
2424
&options,
2425
submodule_prefix,