2007-09-11 03:03:00 +00:00
|
|
|
#ifndef FETCH_PACK_H
|
|
|
|
#define FETCH_PACK_H
|
|
|
|
|
2012-09-09 06:19:40 +00:00
|
|
|
#include "string-list.h"
|
2013-07-08 20:56:53 +00:00
|
|
|
#include "run-command.h"
|
2018-03-15 17:31:28 +00:00
|
|
|
#include "protocol.h"
|
2017-12-08 15:58:40 +00:00
|
|
|
#include "list-objects-filter-options.h"
|
2012-09-09 06:19:40 +00:00
|
|
|
|
2017-03-31 01:40:00 +00:00
|
|
|
struct oid_array;
|
2013-12-05 13:02:39 +00:00
|
|
|
|
2011-03-16 07:08:34 +00:00
|
|
|
struct fetch_pack_args {
|
2007-09-11 03:03:00 +00:00
|
|
|
const char *uploadpack;
|
|
|
|
int unpacklimit;
|
|
|
|
int depth;
|
2016-06-12 10:53:59 +00:00
|
|
|
const char *deepen_since;
|
2016-06-12 10:54:04 +00:00
|
|
|
const struct string_list *deepen_not;
|
2017-12-08 15:58:40 +00:00
|
|
|
struct list_objects_filter_options filter_options;
|
fetch, upload-pack: --deepen=N extends shallow boundary by N commits
In git-fetch, --depth argument is always relative with the latest
remote refs. This makes it a bit difficult to cover this use case,
where the user wants to make the shallow history, say 3 levels
deeper. It would work if remote refs have not moved yet, but nobody
can guarantee that, especially when that use case is performed a
couple months after the last clone or "git fetch --depth". Also,
modifying shallow boundary using --depth does not work well with
clones created by --since or --not.
This patch fixes that. A new argument --deepen=<N> will add <N> more (*)
parent commits to the current history regardless of where remote refs
are.
Have/Want negotiation is still respected. So if remote refs move, the
server will send two chunks: one between "have" and "want" and another
to extend shallow history. In theory, the client could send no "want"s
in order to get the second chunk only. But the protocol does not allow
that. Either you send no want lines, which means ls-remote; or you
have to send at least one want line that carries deep-relative to the
server..
The main work was done by Dongcan Jiang. I fixed it up here and there.
And of course all the bugs belong to me.
(*) We could even support --deepen=<N> where <N> is negative. In that
case we can cut some history from the shallow clone. This operation
(and --depth=<shorter depth>) does not require interaction with remote
side (and more complicated to implement as a result).
Helped-by: Duy Nguyen <pclouds@gmail.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Dongcan Jiang <dongcan.jiang@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-06-12 10:54:09 +00:00
|
|
|
unsigned deepen_relative:1;
|
2013-12-05 13:02:38 +00:00
|
|
|
unsigned quiet:1;
|
|
|
|
unsigned keep_pack:1;
|
|
|
|
unsigned lock_pack:1;
|
|
|
|
unsigned use_thin_pack:1;
|
|
|
|
unsigned fetch_all:1;
|
|
|
|
unsigned stdin_refs:1;
|
2014-01-17 20:21:14 +00:00
|
|
|
unsigned diag_url:1;
|
2013-12-05 13:02:38 +00:00
|
|
|
unsigned verbose:1;
|
|
|
|
unsigned no_progress:1;
|
|
|
|
unsigned include_tag:1;
|
|
|
|
unsigned stateless_rpc:1;
|
|
|
|
unsigned check_self_contained_and_connected:1;
|
|
|
|
unsigned self_contained_and_connected:1;
|
2013-12-05 13:02:39 +00:00
|
|
|
unsigned cloning:1;
|
2013-12-05 13:02:42 +00:00
|
|
|
unsigned update_shallow:1;
|
2016-06-12 10:53:56 +00:00
|
|
|
unsigned deepen:1;
|
introduce fetch-object: fetch one promisor object
Introduce fetch-object, providing the ability to fetch one object from a
promisor remote.
This uses fetch-pack. To do this, the transport mechanism has been
updated with 2 flags, "from-promisor" to indicate that the resulting
pack comes from a promisor remote (and thus should be annotated as such
by index-pack), and "no-dependents" to indicate that only the objects
themselves need to be fetched (but fetching additional objects is
nevertheless safe).
Whenever "no-dependents" is used, fetch-pack will refrain from using any
object flags, because it is most likely invoked as part of a dynamic
object fetch by another Git command (which may itself use object flags).
An alternative to this is to leave fetch-pack alone, and instead update
the allocation of flags so that fetch-pack's flags never overlap with
any others, but this will end up shrinking the number of flags available
to nearly every other Git command (that is, every Git command that
accesses objects), so the approach in this commit was used instead.
This will be tested in a subsequent commit.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-12-05 16:58:49 +00:00
|
|
|
unsigned from_promisor:1;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If 1, fetch_pack() will also not modify any object flags.
|
|
|
|
* This allows fetch_pack() to safely be called by any function,
|
|
|
|
* regardless of which object flags it uses (if any).
|
|
|
|
*/
|
|
|
|
unsigned no_dependents:1;
|
2007-09-11 03:03:00 +00:00
|
|
|
};
|
|
|
|
|
2012-09-09 06:19:43 +00:00
|
|
|
/*
|
2013-01-29 22:02:15 +00:00
|
|
|
* sought represents remote references that should be updated from.
|
|
|
|
* On return, the names that were found on the remote will have been
|
|
|
|
* marked as such.
|
2012-09-09 06:19:43 +00:00
|
|
|
*/
|
2007-09-19 04:49:35 +00:00
|
|
|
struct ref *fetch_pack(struct fetch_pack_args *args,
|
2012-09-09 06:19:39 +00:00
|
|
|
int fd[], struct child_process *conn,
|
|
|
|
const struct ref *ref,
|
|
|
|
const char *dest,
|
2013-01-29 22:02:15 +00:00
|
|
|
struct ref **sought,
|
|
|
|
int nr_sought,
|
2017-03-31 01:40:00 +00:00
|
|
|
struct oid_array *shallow,
|
2018-03-15 17:31:28 +00:00
|
|
|
char **pack_lockfile,
|
|
|
|
enum protocol_version version);
|
2007-09-11 03:03:00 +00:00
|
|
|
|
2017-02-22 16:01:22 +00:00
|
|
|
/*
|
|
|
|
* Print an appropriate error message for each sought ref that wasn't
|
|
|
|
* matched. Return 0 if all sought refs were matched, otherwise 1.
|
|
|
|
*/
|
|
|
|
int report_unmatched_refs(struct ref **sought, int nr_sought);
|
|
|
|
|
2007-09-11 03:03:00 +00:00
|
|
|
#endif
|