Make fetch-pack a builtin with an internal API
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
cf818348f1
commit
2d4177c01c
1
Makefile
1
Makefile
@ -331,6 +331,7 @@ BUILTIN_OBJS = \
|
|||||||
builtin-diff-files.o \
|
builtin-diff-files.o \
|
||||||
builtin-diff-index.o \
|
builtin-diff-index.o \
|
||||||
builtin-diff-tree.o \
|
builtin-diff-tree.o \
|
||||||
|
builtin-fetch-pack.o \
|
||||||
builtin-fetch--tool.o \
|
builtin-fetch--tool.o \
|
||||||
builtin-fmt-merge-msg.o \
|
builtin-fmt-merge-msg.o \
|
||||||
builtin-for-each-ref.o \
|
builtin-for-each-ref.o \
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "exec_cmd.h"
|
#include "exec_cmd.h"
|
||||||
#include "pack.h"
|
#include "pack.h"
|
||||||
#include "sideband.h"
|
#include "sideband.h"
|
||||||
|
#include "fetch-pack.h"
|
||||||
|
|
||||||
static int keep_pack;
|
static int keep_pack;
|
||||||
static int transfer_unpack_limit = -1;
|
static int transfer_unpack_limit = -1;
|
||||||
@ -573,7 +574,7 @@ static int get_pack(int xd[2])
|
|||||||
die("%s died of unnatural causes %d", argv[0], status);
|
die("%s died of unnatural causes %d", argv[0], status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fetch_pack(int fd[2], int nr_match, char **match)
|
static struct ref *do_fetch_pack(int fd[2], int nr_match, char **match)
|
||||||
{
|
{
|
||||||
struct ref *ref;
|
struct ref *ref;
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
@ -615,12 +616,7 @@ static int fetch_pack(int fd[2], int nr_match, char **match)
|
|||||||
die("git-fetch-pack: fetch failed.");
|
die("git-fetch-pack: fetch failed.");
|
||||||
|
|
||||||
all_done:
|
all_done:
|
||||||
while (ref) {
|
return ref;
|
||||||
printf("%s %s\n",
|
|
||||||
sha1_to_hex(ref->old_sha1), ref->name);
|
|
||||||
ref = ref->next;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int remove_duplicates(int nr_heads, char **heads)
|
static int remove_duplicates(int nr_heads, char **heads)
|
||||||
@ -663,15 +659,28 @@ static int fetch_pack_config(const char *var, const char *value)
|
|||||||
|
|
||||||
static struct lock_file lock;
|
static struct lock_file lock;
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
void setup_fetch_pack(struct fetch_pack_args *args)
|
||||||
|
{
|
||||||
|
uploadpack = args->uploadpack;
|
||||||
|
quiet = args->quiet;
|
||||||
|
keep_pack = args->keep_pack;
|
||||||
|
if (args->unpacklimit >= 0)
|
||||||
|
unpack_limit = args->unpacklimit;
|
||||||
|
if (args->keep_pack)
|
||||||
|
unpack_limit = 0;
|
||||||
|
use_thin_pack = args->use_thin_pack;
|
||||||
|
fetch_all = args->fetch_all;
|
||||||
|
verbose = args->verbose;
|
||||||
|
depth = args->depth;
|
||||||
|
no_progress = args->no_progress;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int i, ret, nr_heads;
|
int i, ret, nr_heads;
|
||||||
|
struct ref *ref;
|
||||||
char *dest = NULL, **heads;
|
char *dest = NULL, **heads;
|
||||||
int fd[2];
|
|
||||||
pid_t pid;
|
|
||||||
struct stat st;
|
|
||||||
|
|
||||||
setup_git_directory();
|
|
||||||
git_config(fetch_pack_config);
|
git_config(fetch_pack_config);
|
||||||
|
|
||||||
if (0 <= transfer_unpack_limit)
|
if (0 <= transfer_unpack_limit)
|
||||||
@ -682,7 +691,7 @@ int main(int argc, char **argv)
|
|||||||
nr_heads = 0;
|
nr_heads = 0;
|
||||||
heads = NULL;
|
heads = NULL;
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
char *arg = argv[i];
|
const char *arg = argv[i];
|
||||||
|
|
||||||
if (*arg == '-') {
|
if (*arg == '-') {
|
||||||
if (!prefixcmp(arg, "--upload-pack=")) {
|
if (!prefixcmp(arg, "--upload-pack=")) {
|
||||||
@ -716,8 +725,6 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
if (!prefixcmp(arg, "--depth=")) {
|
if (!prefixcmp(arg, "--depth=")) {
|
||||||
depth = strtol(arg + 8, NULL, 0);
|
depth = strtol(arg + 8, NULL, 0);
|
||||||
if (stat(git_path("shallow"), &st))
|
|
||||||
st.st_mtime = 0;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp("--no-progress", arg)) {
|
if (!strcmp("--no-progress", arg)) {
|
||||||
@ -726,22 +733,52 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
usage(fetch_pack_usage);
|
usage(fetch_pack_usage);
|
||||||
}
|
}
|
||||||
dest = arg;
|
dest = (char *)arg;
|
||||||
heads = argv + i + 1;
|
heads = (char **)(argv + i + 1);
|
||||||
nr_heads = argc - i - 1;
|
nr_heads = argc - i - 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!dest)
|
if (!dest)
|
||||||
usage(fetch_pack_usage);
|
usage(fetch_pack_usage);
|
||||||
pid = git_connect(fd, dest, uploadpack, verbose ? CONNECT_VERBOSE : 0);
|
|
||||||
|
ref = fetch_pack(dest, nr_heads, heads);
|
||||||
|
|
||||||
|
ret = !ref;
|
||||||
|
|
||||||
|
while (ref) {
|
||||||
|
printf("%s %s\n",
|
||||||
|
sha1_to_hex(ref->old_sha1), ref->name);
|
||||||
|
ref = ref->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ref *fetch_pack(const char *dest, int nr_heads, char **heads)
|
||||||
|
{
|
||||||
|
int i, ret;
|
||||||
|
int fd[2];
|
||||||
|
pid_t pid;
|
||||||
|
struct ref *ref;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (depth > 0) {
|
||||||
|
if (stat(git_path("shallow"), &st))
|
||||||
|
st.st_mtime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("connect to %s\n", dest);
|
||||||
|
|
||||||
|
pid = git_connect(fd, (char *)dest, uploadpack,
|
||||||
|
verbose ? CONNECT_VERBOSE : 0);
|
||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
return 1;
|
return NULL;
|
||||||
if (heads && nr_heads)
|
if (heads && nr_heads)
|
||||||
nr_heads = remove_duplicates(nr_heads, heads);
|
nr_heads = remove_duplicates(nr_heads, heads);
|
||||||
ret = fetch_pack(fd, nr_heads, heads);
|
ref = do_fetch_pack(fd, nr_heads, heads);
|
||||||
close(fd[0]);
|
close(fd[0]);
|
||||||
close(fd[1]);
|
close(fd[1]);
|
||||||
ret |= finish_connect(pid);
|
ret = finish_connect(pid);
|
||||||
|
|
||||||
if (!ret && nr_heads) {
|
if (!ret && nr_heads) {
|
||||||
/* If the heads to pull were given, we should have
|
/* If the heads to pull were given, we should have
|
||||||
@ -785,5 +822,8 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return !!ret;
|
if (ret)
|
||||||
|
ref = NULL;
|
||||||
|
|
||||||
|
return ref;
|
||||||
}
|
}
|
@ -31,6 +31,7 @@ extern int cmd_diff_files(int argc, const char **argv, const char *prefix);
|
|||||||
extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
|
extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
|
||||||
extern int cmd_diff(int argc, const char **argv, const char *prefix);
|
extern int cmd_diff(int argc, const char **argv, const char *prefix);
|
||||||
extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
|
extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
|
||||||
|
extern int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
|
||||||
extern int cmd_fetch__tool(int argc, const char **argv, const char *prefix);
|
extern int cmd_fetch__tool(int argc, const char **argv, const char *prefix);
|
||||||
extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
|
extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
|
||||||
extern int cmd_for_each_ref(int argc, const char **argv, const char *prefix);
|
extern int cmd_for_each_ref(int argc, const char **argv, const char *prefix);
|
||||||
|
21
fetch-pack.h
Normal file
21
fetch-pack.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#ifndef FETCH_PACK_H
|
||||||
|
#define FETCH_PACK_H
|
||||||
|
|
||||||
|
struct fetch_pack_args
|
||||||
|
{
|
||||||
|
const char *uploadpack;
|
||||||
|
int quiet;
|
||||||
|
int keep_pack;
|
||||||
|
int unpacklimit;
|
||||||
|
int use_thin_pack;
|
||||||
|
int fetch_all;
|
||||||
|
int verbose;
|
||||||
|
int depth;
|
||||||
|
int no_progress;
|
||||||
|
};
|
||||||
|
|
||||||
|
void setup_fetch_pack(struct fetch_pack_args *args);
|
||||||
|
|
||||||
|
struct ref *fetch_pack(const char *dest, int nr_heads, char **heads);
|
||||||
|
|
||||||
|
#endif
|
1
git.c
1
git.c
@ -334,6 +334,7 @@ static void handle_internal_command(int argc, const char **argv)
|
|||||||
{ "diff-files", cmd_diff_files },
|
{ "diff-files", cmd_diff_files },
|
||||||
{ "diff-index", cmd_diff_index, RUN_SETUP },
|
{ "diff-index", cmd_diff_index, RUN_SETUP },
|
||||||
{ "diff-tree", cmd_diff_tree, RUN_SETUP },
|
{ "diff-tree", cmd_diff_tree, RUN_SETUP },
|
||||||
|
{ "fetch-pack", cmd_fetch_pack, RUN_SETUP },
|
||||||
{ "fetch--tool", cmd_fetch__tool, RUN_SETUP },
|
{ "fetch--tool", cmd_fetch__tool, RUN_SETUP },
|
||||||
{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
|
{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
|
||||||
{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
|
{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
|
||||||
|
Loading…
Reference in New Issue
Block a user