Merge branch 'nd/shallow-deepen'
The existing "git fetch --depth=<n>" option was hard to use correctly when making the history of an existing shallow clone deeper. A new option, "--deepen=<n>", has been added to make this easier to use. "git clone" also learned "--shallow-since=<date>" and "--shallow-exclude=<tag>" options to make it easier to specify "I am interested only in the recent N months worth of history" and "Give me only the history since that version". * nd/shallow-deepen: (27 commits) fetch, upload-pack: --deepen=N extends shallow boundary by N commits upload-pack: add get_reachable_list() upload-pack: split check_unreachable() in two, prep for get_reachable_list() t5500, t5539: tests for shallow depth excluding a ref clone: define shallow clone boundary with --shallow-exclude fetch: define shallow boundary with --shallow-exclude upload-pack: support define shallow boundary by excluding revisions refs: add expand_ref() t5500, t5539: tests for shallow depth since a specific date clone: define shallow clone boundary based on time with --shallow-since fetch: define shallow boundary with --shallow-since upload-pack: add deepen-since to cut shallow repos based on time shallow.c: implement a generic shallow boundary finder based on rev-list fetch-pack: use a separate flag for fetch in deepening mode fetch-pack.c: mark strings for translating fetch-pack: use a common function for verbose printing fetch-pack: use skip_prefix() instead of starts_with() upload-pack: move rev-list code out of check_non_tip() upload-pack: make check_non_tip() clean things up on error upload-pack: tighten number parsing at "deepen" lines ...
This commit is contained in:
@ -35,13 +35,15 @@ static int fetch_prune_config = -1; /* unspecified */
|
||||
static int prune = -1; /* unspecified */
|
||||
#define PRUNE_BY_DEFAULT 0 /* do we prune by default? */
|
||||
|
||||
static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity;
|
||||
static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity, deepen_relative;
|
||||
static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
|
||||
static int tags = TAGS_DEFAULT, unshallow, update_shallow;
|
||||
static int tags = TAGS_DEFAULT, unshallow, update_shallow, deepen;
|
||||
static int max_children = -1;
|
||||
static enum transport_family family;
|
||||
static const char *depth;
|
||||
static const char *deepen_since;
|
||||
static const char *upload_pack;
|
||||
static struct string_list deepen_not = STRING_LIST_INIT_NODUP;
|
||||
static struct strbuf default_rla = STRBUF_INIT;
|
||||
static struct transport *gtransport;
|
||||
static struct transport *gsecondary;
|
||||
@ -117,6 +119,12 @@ static struct option builtin_fetch_options[] = {
|
||||
OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
|
||||
OPT_STRING(0, "depth", &depth, N_("depth"),
|
||||
N_("deepen history of shallow clone")),
|
||||
OPT_STRING(0, "shallow-since", &deepen_since, N_("time"),
|
||||
N_("deepen history of shallow repository based on time")),
|
||||
OPT_STRING_LIST(0, "shallow-exclude", &deepen_not, N_("revision"),
|
||||
N_("deepen history of shallow clone by excluding rev")),
|
||||
OPT_INTEGER(0, "deepen", &deepen_relative,
|
||||
N_("deepen history of shallow clone")),
|
||||
{ OPTION_SET_INT, 0, "unshallow", &unshallow, NULL,
|
||||
N_("convert to a complete repository"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_NOARG, NULL, 1 },
|
||||
@ -875,7 +883,7 @@ static int quickfetch(struct ref *ref_map)
|
||||
* really need to perform. Claiming failure now will ensure
|
||||
* we perform the network exchange to deepen our history.
|
||||
*/
|
||||
if (depth)
|
||||
if (deepen)
|
||||
return -1;
|
||||
opt.quiet = 1;
|
||||
return check_connected(iterate_ref_map, &rm, &opt);
|
||||
@ -983,7 +991,7 @@ static void set_option(struct transport *transport, const char *name, const char
|
||||
name, transport->url);
|
||||
}
|
||||
|
||||
static struct transport *prepare_transport(struct remote *remote)
|
||||
static struct transport *prepare_transport(struct remote *remote, int deepen)
|
||||
{
|
||||
struct transport *transport;
|
||||
transport = transport_get(remote, NULL);
|
||||
@ -995,6 +1003,13 @@ static struct transport *prepare_transport(struct remote *remote)
|
||||
set_option(transport, TRANS_OPT_KEEP, "yes");
|
||||
if (depth)
|
||||
set_option(transport, TRANS_OPT_DEPTH, depth);
|
||||
if (deepen && deepen_since)
|
||||
set_option(transport, TRANS_OPT_DEEPEN_SINCE, deepen_since);
|
||||
if (deepen && deepen_not.nr)
|
||||
set_option(transport, TRANS_OPT_DEEPEN_NOT,
|
||||
(const char *)&deepen_not);
|
||||
if (deepen_relative)
|
||||
set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, "yes");
|
||||
if (update_shallow)
|
||||
set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes");
|
||||
return transport;
|
||||
@ -1002,13 +1017,25 @@ static struct transport *prepare_transport(struct remote *remote)
|
||||
|
||||
static void backfill_tags(struct transport *transport, struct ref *ref_map)
|
||||
{
|
||||
if (transport->cannot_reuse) {
|
||||
gsecondary = prepare_transport(transport->remote);
|
||||
int cannot_reuse;
|
||||
|
||||
/*
|
||||
* Once we have set TRANS_OPT_DEEPEN_SINCE, we can't unset it
|
||||
* when remote helper is used (setting it to an empty string
|
||||
* is not unsetting). We could extend the remote helper
|
||||
* protocol for that, but for now, just force a new connection
|
||||
* without deepen-since. Similar story for deepen-not.
|
||||
*/
|
||||
cannot_reuse = transport->cannot_reuse ||
|
||||
deepen_since || deepen_not.nr;
|
||||
if (cannot_reuse) {
|
||||
gsecondary = prepare_transport(transport->remote, 0);
|
||||
transport = gsecondary;
|
||||
}
|
||||
|
||||
transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, NULL);
|
||||
transport_set_option(transport, TRANS_OPT_DEPTH, "0");
|
||||
transport_set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, NULL);
|
||||
fetch_refs(transport, ref_map);
|
||||
|
||||
if (gsecondary) {
|
||||
@ -1219,7 +1246,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv)
|
||||
die(_("No remote repository specified. Please, specify either a URL or a\n"
|
||||
"remote name from which new revisions should be fetched."));
|
||||
|
||||
gtransport = prepare_transport(remote);
|
||||
gtransport = prepare_transport(remote, 1);
|
||||
|
||||
if (prune < 0) {
|
||||
/* no command line request */
|
||||
@ -1279,6 +1306,13 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
|
||||
argc = parse_options(argc, argv, prefix,
|
||||
builtin_fetch_options, builtin_fetch_usage, 0);
|
||||
|
||||
if (deepen_relative) {
|
||||
if (deepen_relative < 0)
|
||||
die(_("Negative depth in --deepen is not supported"));
|
||||
if (depth)
|
||||
die(_("--deepen and --depth are mutually exclusive"));
|
||||
depth = xstrfmt("%d", deepen_relative);
|
||||
}
|
||||
if (unshallow) {
|
||||
if (depth)
|
||||
die(_("--depth and --unshallow cannot be used together"));
|
||||
@ -1291,6 +1325,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
|
||||
/* no need to be strict, transport_set_option() will validate it again */
|
||||
if (depth && atoi(depth) < 1)
|
||||
die(_("depth %s is not a positive number"), depth);
|
||||
if (depth || deepen_since || deepen_not.nr)
|
||||
deepen = 1;
|
||||
|
||||
if (recurse_submodules != RECURSE_SUBMODULES_OFF) {
|
||||
if (recurse_submodules_default) {
|
||||
|
||||
Reference in New Issue
Block a user