Retire git-clone-pack

The program is not used by git-clone since git-fetch-pack was extended
to allow its caller do what git-clone-pack alone did, and git-clone was
updated to use it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-06-20 23:54:26 -07:00
parent 363b7817e0
commit efc7fa5355
9 changed files with 7 additions and 263 deletions

1
.gitignore vendored
View File

@ -17,7 +17,6 @@ git-cherry
git-cherry-pick git-cherry-pick
git-clean git-clean
git-clone git-clone
git-clone-pack
git-commit git-commit
git-commit-tree git-commit-tree
git-convert-objects git-convert-objects

View File

@ -1,64 +0,0 @@
git-clone-pack(1)
=================
NAME
----
git-clone-pack - Clones a repository by receiving packed objects
SYNOPSIS
--------
'git-clone-pack' [--exec=<git-upload-pack>] [<host>:]<directory> [<head>...]
DESCRIPTION
-----------
Clones a repository into the current repository by invoking
'git-upload-pack', possibly on the remote host via ssh, in
the named repository, and stores the sent pack in the local
repository.
OPTIONS
-------
--exec=<git-upload-pack>::
Use this to specify the path to 'git-upload-pack' on the
remote side, if it is not found on your $PATH.
Installations of sshd ignore the user's environment
setup scripts for login shells (e.g. .bash_profile) and
your privately installed git may not be found on the system
default $PATH. Another workaround suggested is to set
up your $PATH in ".bashrc", but this flag is for people
who do not want to pay the overhead for non-interactive
shells by having a lean .bashrc file (they set most of
the things up in .bash_profile).
<host>::
A remote host that houses the repository. When this
part is specified, 'git-upload-pack' is invoked via
ssh.
<directory>::
The repository to sync from.
<head>...::
The heads to update. This is relative to $GIT_DIR
(e.g. "HEAD", "refs/heads/master"). When unspecified,
all heads are updated to match the remote repository.
+
Usually all the refs from existing repository are stored
under the same name in the new repository. Giving explicit
<head> arguments instead writes the object names and refs to
the standard output, just like get-fetch-pack does.
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
Documentation
--------------
Documentation by Junio C Hamano.
GIT
---
Part of the gitlink:git[7] suite

View File

@ -62,7 +62,7 @@ OPTIONS
--quiet:: --quiet::
-q:: -q::
Operate quietly. This flag is passed to "rsync" and Operate quietly. This flag is passed to "rsync" and
"git-clone-pack" commands when given. "git-fetch-pack" commands when given.
-n:: -n::
No checkout of HEAD is performed after the clone is complete. No checkout of HEAD is performed after the clone is complete.
@ -85,7 +85,7 @@ OPTIONS
--upload-pack <upload-pack>:: --upload-pack <upload-pack>::
-u <upload-pack>:: -u <upload-pack>::
When given, and the repository to clone from is handled When given, and the repository to clone from is handled
by 'git-clone-pack', '--exec=<upload-pack>' is passed to by 'git-fetch-pack', '--exec=<upload-pack>' is passed to
the command to specify non-default path for the command the command to specify non-default path for the command
run on the other end. run on the other end.

View File

@ -18,8 +18,7 @@ information fed from the remote end.
This command is usually not invoked directly by the end user. This command is usually not invoked directly by the end user.
The UI for the protocol is on the 'git-send-pack' side, and the The UI for the protocol is on the 'git-send-pack' side, and the
program pair is meant to be used to push updates to remote program pair is meant to be used to push updates to remote
repository. For pull operations, see 'git-fetch-pack' and repository. For pull operations, see 'git-fetch-pack'.
'git-clone-pack'.
The command allows for creation and fast forwarding of sha1 refs The command allows for creation and fast forwarding of sha1 refs
(heads/tags) on the remote end (strictly speaking, it is the (heads/tags) on the remote end (strictly speaking, it is the

View File

@ -12,7 +12,7 @@ SYNOPSIS
DESCRIPTION DESCRIPTION
----------- -----------
Invoked by 'git-clone-pack' and/or 'git-fetch-pack', learns what Invoked by 'git-fetch-pack', learns what
objects the other side is missing, and sends them after packing. objects the other side is missing, and sends them after packing.
This command is usually not invoked directly by the end user. This command is usually not invoked directly by the end user.

View File

@ -192,10 +192,6 @@ the working tree.
Synching repositories Synching repositories
~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~
gitlink:git-clone-pack[1]::
Clones a repository into the current repository (engine
for ssh and local transport).
gitlink:git-fetch-pack[1]:: gitlink:git-fetch-pack[1]::
Updates from a remote repository (engine for ssh and Updates from a remote repository (engine for ssh and
local transport). local transport).
@ -237,7 +233,7 @@ gitlink:git-update-server-info[1]::
clients discover references and packs on it. clients discover references and packs on it.
gitlink:git-upload-pack[1]:: gitlink:git-upload-pack[1]::
Invoked by 'git-clone-pack' and 'git-fetch-pack' to push Invoked by 'git-fetch-pack' to push
what are asked for. what are asked for.
gitlink:git-upload-tar[1]:: gitlink:git-upload-tar[1]::

View File

@ -96,7 +96,7 @@ Issues of note:
$ mkdir manual && cd manual $ mkdir manual && cd manual
$ git init-db $ git init-db
$ git clone-pack git://git.kernel.org/pub/scm/git/git.git man html | $ git fetch-pack git://git.kernel.org/pub/scm/git/git.git man html |
while read a b while read a b
do do
echo $a >.git/$b echo $a >.git/$b

View File

@ -149,7 +149,7 @@ SIMPLE_PROGRAMS = \
# ... and all the rest that could be moved out of bindir to gitexecdir # ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS = \ PROGRAMS = \
git-checkout-index$X git-clone-pack$X \ git-checkout-index$X \
git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \ git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \
git-hash-object$X git-index-pack$X git-local-fetch$X \ git-hash-object$X git-index-pack$X git-local-fetch$X \
git-mailinfo$X git-merge-base$X \ git-mailinfo$X git-merge-base$X \

View File

@ -1,186 +0,0 @@
#include "cache.h"
#include "refs.h"
#include "pkt-line.h"
static const char clone_pack_usage[] =
"git-clone-pack [--exec=<git-upload-pack>] [<host>:]<directory> [<heads>]*";
static const char *exec = "git-upload-pack";
static int quiet = 0;
static void clone_handshake(int fd[2], struct ref *ref)
{
unsigned char sha1[20];
while (ref) {
packet_write(fd[1], "want %s\n", sha1_to_hex(ref->old_sha1));
ref = ref->next;
}
packet_flush(fd[1]);
/* We don't have nuttin' */
packet_write(fd[1], "done\n");
if (get_ack(fd[0], sha1))
error("Huh! git-clone-pack got positive ack for %s", sha1_to_hex(sha1));
}
static int is_master(struct ref *ref)
{
return !strcmp(ref->name, "refs/heads/master");
}
static void write_one_ref(struct ref *ref)
{
char *path = git_path("%s", ref->name);
int fd;
char *hex;
if (!strncmp(ref->name, "refs/", 5) &&
check_ref_format(ref->name + 5)) {
error("refusing to create funny ref '%s' locally", ref->name);
return;
}
if (safe_create_leading_directories(path))
die("unable to create leading directory for %s", ref->name);
fd = open(path, O_CREAT | O_EXCL | O_WRONLY, 0666);
if (fd < 0)
die("unable to create ref %s", ref->name);
hex = sha1_to_hex(ref->old_sha1);
hex[40] = '\n';
if (write(fd, hex, 41) != 41)
die("unable to write ref %s", ref->name);
close(fd);
}
static void write_refs(struct ref *ref)
{
struct ref *head = NULL, *head_ptr, *master_ref;
char *head_path;
/* Upload-pack must report HEAD first */
if (!strcmp(ref->name, "HEAD")) {
head = ref;
ref = ref->next;
}
head_ptr = NULL;
master_ref = NULL;
while (ref) {
if (is_master(ref))
master_ref = ref;
if (head &&
!memcmp(ref->old_sha1, head->old_sha1, 20) &&
!strncmp(ref->name, "refs/heads/",11) &&
(!head_ptr || ref == master_ref))
head_ptr = ref;
write_one_ref(ref);
ref = ref->next;
}
if (!head) {
fprintf(stderr, "No HEAD in remote.\n");
return;
}
head_path = strdup(git_path("HEAD"));
if (!head_ptr) {
/*
* If we had a master ref, and it wasn't HEAD, we need to undo the
* symlink, and write a standalone HEAD. Give a warning, because that's
* really really wrong.
*/
if (master_ref) {
error("HEAD doesn't point to any refs! Making standalone HEAD");
unlink(head_path);
}
write_one_ref(head);
free(head_path);
return;
}
/* We reset to the master branch if it's available */
if (master_ref)
return;
fprintf(stderr, "Setting HEAD to %s\n", head_ptr->name);
/*
* Uhhuh. Other end didn't have master. We start HEAD off with
* the first branch with the same value.
*/
if (create_symref(head_path, head_ptr->name) < 0)
die("unable to link HEAD to %s", head_ptr->name);
free(head_path);
}
static int clone_pack(int fd[2], int nr_match, char **match)
{
struct ref *refs;
int status;
get_remote_heads(fd[0], &refs, nr_match, match, 1);
if (!refs) {
packet_flush(fd[1]);
die("no matching remote head");
}
clone_handshake(fd, refs);
status = receive_keep_pack(fd, "git-clone-pack", quiet);
if (!quiet)
fprintf(stderr, "\n");
if (!status) {
if (nr_match == 0)
write_refs(refs);
else
while (refs) {
printf("%s %s\n",
sha1_to_hex(refs->old_sha1),
refs->name);
refs = refs->next;
}
}
return status;
}
int main(int argc, char **argv)
{
int i, ret, nr_heads;
char *dest = NULL, **heads;
int fd[2];
pid_t pid;
setup_git_directory();
nr_heads = 0;
heads = NULL;
for (i = 1; i < argc; i++) {
char *arg = argv[i];
if (*arg == '-') {
if (!strcmp("-q", arg)) {
quiet = 1;
continue;
}
if (!strncmp("--exec=", arg, 7)) {
exec = arg + 7;
continue;
}
usage(clone_pack_usage);
}
dest = arg;
heads = argv + i + 1;
nr_heads = argc - i - 1;
break;
}
if (!dest)
usage(clone_pack_usage);
pid = git_connect(fd, dest, exec);
if (pid < 0)
return 1;
ret = clone_pack(fd, nr_heads, heads);
close(fd[0]);
close(fd[1]);
finish_connect(pid);
return ret;
}