Merge branch 'master' of .

This commit is contained in:
Junio C Hamano 2005-09-05 01:42:11 -07:00
commit 712d865523
7 changed files with 134 additions and 111 deletions

View File

@ -1,36 +0,0 @@
git-clone-dumb-http(1)
======================
NAME
----
git-clone-dumb-http - Client to clone a repository via HTTP.
SYNOPSIS
--------
'git-clone-dumb-http' <remote-repo> <local-dir>
DESCRIPTION
-----------
Client to clone, via HTTP, a repository that has been prepared with
update-server-info.
OPTIONS
-------
<remote-repo>::
Remote repository to clone from.
<local-dir>::
Directory to clone to.
Author
------
Written by Junio C Hamano <junkio@cox.net>
Documentation
--------------
Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
GIT
---
Part of the link:git.html[git] suite

View File

@ -33,16 +33,21 @@ The options available are:
the value GIT_COMMITTER_IDENT, as returned by "git-var -l". the value GIT_COMMITTER_IDENT, as returned by "git-var -l".
The user will still be prompted to confirm this entry. The user will still be prompted to confirm this entry.
--compose
Use \$EDITOR to edit an introductory message for the
patch series.
--subject --subject
Specify the initial subject of the email thread. Specify the initial subject of the email thread.
Only necessary if --compose is also set. If --compose
is not set, this will be prompted for.
--in-reply-to --in-reply-to
Specify the contents of the first In-Reply-To header. Specify the contents of the first In-Reply-To header.
Subsequent emails will refer to the previous email Subsequent emails will refer to the previous email
instead of this. instead of this if --chain-reply-to is set (the default)
When overriding on the command line, it may be necessary Only necessary if --compose is also set. If --compose
to set this to a space. For example is not set, this will be prompted for.
--in-reply-to=" "
--chain-reply-to, --no-chain-reply-to --chain-reply-to, --no-chain-reply-to
If this is set, each email will be sent as a reply to the previous If this is set, each email will be sent as a reply to the previous

View File

@ -329,9 +329,6 @@ link:git-build-rev-cache.html[git-build-rev-cache]::
link:git-checkout-script.html[git-checkout-script]:: link:git-checkout-script.html[git-checkout-script]::
git-checkout-script. git-checkout-script.
link:git-clone-dumb-http.html[git-clone-dumb-http]::
git-clone-dumb-http.
link:git-daemon.html[git-daemon]:: link:git-daemon.html[git-daemon]::
git-daemon. git-daemon.

View File

@ -65,12 +65,13 @@ SCRIPTS=git git-merge-one-file-script git-prune-script \
gitk git-cherry git-rebase-script git-relink-script git-repack-script \ gitk git-cherry git-rebase-script git-relink-script git-repack-script \
git-format-patch-script git-sh-setup-script git-push-script \ git-format-patch-script git-sh-setup-script git-push-script \
git-branch-script git-parse-remote-script git-verify-tag-script \ git-branch-script git-parse-remote-script git-verify-tag-script \
git-ls-remote-script git-clone-dumb-http git-rename-script \ git-ls-remote-script git-rename-script \
git-request-pull-script git-bisect-script git-request-pull-script git-bisect-script
SCRIPTS += git-count-objects-script SCRIPTS += git-count-objects-script
SCRIPTS += git-revert-script SCRIPTS += git-revert-script
SCRIPTS += git-octopus-script SCRIPTS += git-octopus-script
SCRIPTS += git-archimport-script
PROG= git-update-cache git-diff-files git-init-db git-write-tree \ PROG= git-update-cache git-diff-files git-init-db git-write-tree \
git-read-tree git-commit-tree git-cat-file git-fsck-cache \ git-read-tree git-commit-tree git-cat-file git-fsck-cache \

View File

@ -1,51 +0,0 @@
#!/bin/sh
#
# Copyright (c) 2005, Junio C Hamano
#
# Called by git-clone-script
# Exits 2 when the remote site does not support dumb server protocol.
# Usage: git-clone-dumb-http <remote-repo> <local-dir>
R=${1?"remote repository"} D=${2?"local directory"}
if [ -n "$GIT_SSL_NO_VERIFY" ]; then
curl_extra_args="-k"
fi
http_fetch () {
# $1 = Remote, $2 = Local
curl -nsf $curl_extra_args "$1" >"$2"
}
cd "$D" &&
clone_tmp=".git/clone-tmp" &&
mkdir -p "$clone_tmp" || exit 1
trap "rm -rf .git/clone-tmp" 0 1 2 3 15
http_fetch "$R/info/refs" "$clone_tmp/refs" &&
http_fetch "$R/objects/info/packs" "$clone_tmp/packs" || exit 2
# We do not have to worry about rev-cache when cloning.
# http_fetch "$R/info/rev-cache" "$clone_tmp/rev-cache"
# Clone packs
while read type name
do
case "$type" in
P) ;;
*) continue ;;
esac &&
idx=`expr "$name" : '\(.*\)\.pack'`.idx
http_fetch "$R/objects/pack/$name" ".git/objects/pack/$name" &&
http_fetch "$R/objects/pack/$idx" ".git/objects/pack/$idx" &&
git-verify-pack ".git/objects/pack/$idx" || exit 1
done <"$clone_tmp/packs"
# Then clone refs.
while read sha1 refname
do
name=`expr "$refname" : 'refs/\(.*\)'` &&
git-http-pull -v -a -w "$name" "$name" "$R/" || exit 1
done <"$clone_tmp/refs"

View File

@ -14,6 +14,47 @@ get_repo_base() {
(cd "$1" && (cd .git ; pwd)) 2> /dev/null (cd "$1" && (cd .git ; pwd)) 2> /dev/null
} }
if [ -n "$GIT_SSL_NO_VERIFY" ]; then
curl_extra_args="-k"
fi
http_fetch () {
# $1 = Remote, $2 = Local
curl -nsf $curl_extra_args "$1" >"$2"
}
clone_dumb_http () {
# $1 - remote, $2 - local
cd "$2" &&
clone_tmp='.git/clone-tmp' &&
mkdir -p "$clone_tmp" || exit 1
http_fetch "$1/info/refs" "$clone_tmp/refs" &&
http_fetch "$1/objects/info/packs" "$clone_tmp/packs" || {
echo >&2 "Cannot get remote repository information.
Perhaps git-update-server-info needs to be run there?"
exit 1;
}
while read type name
do
case "$type" in
P) ;;
*) continue ;;
esac &&
idx=`expr "$name" : '\(.*\)\.pack'`.idx
http_fetch "$1/objects/pack/$name" ".git/objects/pack/$name" &&
http_fetch "$1/objects/pack/$idx" ".git/objects/pack/$idx" &&
git-verify-pack ".git/objects/pack/$idx" || exit 1
done <"$clone_tmp/packs"
while read sha1 refname
do
name=`expr "$refname" : 'refs/\(.*\)'` &&
git-http-pull -v -a -w "$name" "$name" "$1/" || exit 1
done <"$clone_tmp/refs"
rm -fr "$clone_tmp"
}
quiet= quiet=
use_local=no use_local=no
local_shared=no local_shared=no
@ -104,17 +145,7 @@ yes,yes)
rsync $quiet -avz --ignore-existing "$repo/refs/" "$D/.git/refs/" rsync $quiet -avz --ignore-existing "$repo/refs/" "$D/.git/refs/"
;; ;;
http://*) http://*)
git-clone-dumb-http "$repo" "$D" clone_dumb_http "$repo" "$D"
case "$?" in
2)
echo "Somebody should define smarter http server protocol" >&2
exit 1
;;
0)
;;
*)
exit
esac
;; ;;
*) *)
cd "$D" && case "$upload_pack" in cd "$D" && case "$upload_pack" in

View File

@ -25,9 +25,13 @@ use Data::Dumper;
use Email::Valid; use Email::Valid;
sub unique_email_list(@); sub unique_email_list(@);
sub cleanup_compose_files();
# Constants (essentially)
my $compose_filename = ".msg.$$";
# Variables we fill in automatically, or via prompting: # Variables we fill in automatically, or via prompting:
my (@to,@cc,$initial_reply_to,$initial_subject,@files,$from); my (@to,@cc,$initial_reply_to,$initial_subject,@files,$from,$compose);
# Behavior modification variables # Behavior modification variables
my ($chain_reply_to, $smtp_server) = (1, "localhost"); my ($chain_reply_to, $smtp_server) = (1, "localhost");
@ -46,6 +50,7 @@ my $rc = GetOptions("from=s" => \$from,
"to=s" => \@to, "to=s" => \@to,
"chain-reply-to!" => \$chain_reply_to, "chain-reply-to!" => \$chain_reply_to,
"smtp-server=s" => \$smtp_server, "smtp-server=s" => \$smtp_server,
"compose" => \$compose,
); );
# Now, let's fill any that aren't set in with defaults: # Now, let's fill any that aren't set in with defaults:
@ -69,7 +74,7 @@ while(<GITVAR>) {
} }
close(GITVAR); close(GITVAR);
my $prompting = 0;
if (!defined $from) { if (!defined $from) {
$from = $author || $committer; $from = $author || $committer;
do { do {
@ -79,6 +84,7 @@ if (!defined $from) {
$from = $_; $from = $_;
print "Emails will be sent from: ", $from, "\n"; print "Emails will be sent from: ", $from, "\n";
$prompting++;
} }
if (!@to) { if (!@to) {
@ -88,19 +94,21 @@ if (!@to) {
} while (!defined $_); } while (!defined $_);
my $to = $_; my $to = $_;
push @to, split /,/, $to; push @to, split /,/, $to;
$prompting++;
} }
if (!defined $initial_subject) { if (!defined $initial_subject && $compose) {
do { do {
$_ = $term->readline("What subject should the emails start with? ", $_ = $term->readline("What subject should the emails start with? ",
$initial_subject); $initial_subject);
} while (!defined $_); } while (!defined $_);
$initial_subject = $_; $initial_subject = $_;
$prompting++;
} }
if (!defined $initial_reply_to) { if (!defined $initial_reply_to && $prompting) {
do { do {
$_= $term->readline("Message-ID to be used as In-Reply-To? ", $_= $term->readline("Message-ID to be used as In-Reply-To for the first email? ",
$initial_reply_to); $initial_reply_to);
} while (!defined $_); } while (!defined $_);
@ -112,6 +120,52 @@ if (!defined $smtp_server) {
$smtp_server = "localhost"; $smtp_server = "localhost";
} }
if ($compose) {
# Note that this does not need to be secure, but we will make a small
# effort to have it be unique
open(C,">",$compose_filename)
or die "Failed to open for writing $compose_filename: $!";
print C "From \n";
printf C "Subject: %s\n\n", $initial_subject;
printf C <<EOT;
GIT: Please enter your email below.
GIT: Lines beginning in "GIT: " will be removed.
GIT: Consider including an overall diffstat or table of contents
GIT: for the patch you are writing.
EOT
close(C);
my $editor = $ENV{EDITOR};
$editor = 'vi' unless defined $editor;
system($editor, $compose_filename);
open(C2,">",$compose_filename . ".final")
or die "Failed to open $compose_filename.final : " . $!;
open(C,"<",$compose_filename)
or die "Failed to open $compose_filename : " . $!;
while(<C>) {
next if m/^GIT: /;
print C2 $_;
}
close(C);
close(C2);
do {
$_ = $term->readline("Send this email? (y|n) ");
} while (!defined $_);
if (uc substr($_,0,1) ne 'Y') {
cleanup_compose_files();
exit(0);
}
@files = ($compose_filename . ".final");
}
# Now that all the defaults are set, process the rest of the command line # Now that all the defaults are set, process the rest of the command line
# arguments and collect up the files that need to be processed. # arguments and collect up the files that need to be processed.
for my $f (@ARGV) { for my $f (@ARGV) {
@ -137,12 +191,24 @@ if (@files) {
git-send-email-script [options] <file | directory> [... file | directory ] git-send-email-script [options] <file | directory> [... file | directory ]
Options: Options:
--from Specify the "From:" line of the email to be sent. --from Specify the "From:" line of the email to be sent.
--to Specify the primary "To:" line of the email. --to Specify the primary "To:" line of the email.
--compose Use \$EDITOR to edit an introductory message for the
patch series.
--subject Specify the initial "Subject:" line. --subject Specify the initial "Subject:" line.
Only necessary if --compose is also set. If --compose
is not set, this will be prompted for.
--in-reply-to Specify the first "In-Reply-To:" header line. --in-reply-to Specify the first "In-Reply-To:" header line.
Only used if --compose is also set. If --compose is not
set, this will be prompted for.
--chain-reply-to If set, the replies will all be to the previous --chain-reply-to If set, the replies will all be to the previous
email sent, rather than to the first email sent. email sent, rather than to the first email sent.
Defaults to on. Defaults to on.
--smtp-server If set, specifies the outgoing SMTP server to use. --smtp-server If set, specifies the outgoing SMTP server to use.
Defaults to localhost. Defaults to localhost.
@ -278,6 +344,16 @@ foreach my $t (@files) {
make_message_id(); make_message_id();
} }
if ($compose) {
cleanup_compose_files();
}
sub cleanup_compose_files() {
unlink($compose_filename, $compose_filename . ".final");
}
sub unique_email_list(@) { sub unique_email_list(@) {
my %seen; my %seen;