diff --git a/Documentation/git-clone-dumb-http.txt b/Documentation/git-clone-dumb-http.txt deleted file mode 100644 index 1704649229..0000000000 --- a/Documentation/git-clone-dumb-http.txt +++ /dev/null @@ -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' - -DESCRIPTION ------------ -Client to clone, via HTTP, a repository that has been prepared with -update-server-info. - -OPTIONS -------- -:: - Remote repository to clone from. - -:: - Directory to clone to. - -Author ------- -Written by Junio C Hamano - -Documentation --------------- -Documentation by Junio C Hamano and the git-list . - -GIT ---- -Part of the link:git.html[git] suite - diff --git a/Documentation/git-send-email-script.txt b/Documentation/git-send-email-script.txt index 89f98bbf70..9ad82cc3e4 100644 --- a/Documentation/git-send-email-script.txt +++ b/Documentation/git-send-email-script.txt @@ -33,16 +33,21 @@ The options available are: the value GIT_COMMITTER_IDENT, as returned by "git-var -l". The user will still be prompted to confirm this entry. + --compose + Use \$EDITOR to edit an introductory message for the + patch series. + --subject 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 Specify the contents of the first In-Reply-To header. Subsequent emails will refer to the previous email - instead of this. - When overriding on the command line, it may be necessary - to set this to a space. For example - --in-reply-to=" " + instead of this if --chain-reply-to is set (the default) + Only necessary if --compose is also set. If --compose + is not set, this will be prompted for. --chain-reply-to, --no-chain-reply-to If this is set, each email will be sent as a reply to the previous diff --git a/Documentation/git.txt b/Documentation/git.txt index 2f8a6479e1..0bcd99027d 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -329,9 +329,6 @@ link:git-build-rev-cache.html[git-build-rev-cache]:: link:git-checkout-script.html[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]:: git-daemon. diff --git a/Makefile b/Makefile index f13ff5aa29..033c96e8f1 100644 --- a/Makefile +++ b/Makefile @@ -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 \ git-format-patch-script git-sh-setup-script git-push-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 SCRIPTS += git-count-objects-script SCRIPTS += git-revert-script SCRIPTS += git-octopus-script +SCRIPTS += git-archimport-script 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 \ diff --git a/git-clone-dumb-http b/git-clone-dumb-http deleted file mode 100755 index 50527086a0..0000000000 --- a/git-clone-dumb-http +++ /dev/null @@ -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 - -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" diff --git a/git-clone-script b/git-clone-script index f988b8c9c7..0848a5d7a7 100755 --- a/git-clone-script +++ b/git-clone-script @@ -14,6 +14,47 @@ get_repo_base() { (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= use_local=no local_shared=no @@ -104,17 +145,7 @@ yes,yes) rsync $quiet -avz --ignore-existing "$repo/refs/" "$D/.git/refs/" ;; http://*) - git-clone-dumb-http "$repo" "$D" - case "$?" in - 2) - echo "Somebody should define smarter http server protocol" >&2 - exit 1 - ;; - 0) - ;; - *) - exit - esac + clone_dumb_http "$repo" "$D" ;; *) cd "$D" && case "$upload_pack" in diff --git a/git-send-email-script b/git-send-email-script index 1dbdbaf391..86b676a040 100755 --- a/git-send-email-script +++ b/git-send-email-script @@ -25,9 +25,13 @@ use Data::Dumper; use Email::Valid; sub unique_email_list(@); +sub cleanup_compose_files(); + +# Constants (essentially) +my $compose_filename = ".msg.$$"; # 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 my ($chain_reply_to, $smtp_server) = (1, "localhost"); @@ -46,6 +50,7 @@ my $rc = GetOptions("from=s" => \$from, "to=s" => \@to, "chain-reply-to!" => \$chain_reply_to, "smtp-server=s" => \$smtp_server, + "compose" => \$compose, ); # Now, let's fill any that aren't set in with defaults: @@ -69,7 +74,7 @@ while() { } close(GITVAR); - +my $prompting = 0; if (!defined $from) { $from = $author || $committer; do { @@ -79,6 +84,7 @@ if (!defined $from) { $from = $_; print "Emails will be sent from: ", $from, "\n"; + $prompting++; } if (!@to) { @@ -88,19 +94,21 @@ if (!@to) { } while (!defined $_); my $to = $_; push @to, split /,/, $to; + $prompting++; } -if (!defined $initial_subject) { +if (!defined $initial_subject && $compose) { do { $_ = $term->readline("What subject should the emails start with? ", $initial_subject); } while (!defined $_); $initial_subject = $_; + $prompting++; } -if (!defined $initial_reply_to) { +if (!defined $initial_reply_to && $prompting) { 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); } while (!defined $_); @@ -112,6 +120,52 @@ if (!defined $smtp_server) { $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 <",$compose_filename . ".final") + or die "Failed to open $compose_filename.final : " . $!; + + open(C,"<",$compose_filename) + or die "Failed to open $compose_filename : " . $!; + + while() { + 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 # arguments and collect up the files that need to be processed. for my $f (@ARGV) { @@ -137,12 +191,24 @@ if (@files) { git-send-email-script [options] [... file | directory ] Options: --from Specify the "From:" line of the email to be sent. + --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. + 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. + 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 email sent, rather than to the first email sent. Defaults to on. + --smtp-server If set, specifies the outgoing SMTP server to use. Defaults to localhost. @@ -278,6 +344,16 @@ foreach my $t (@files) { make_message_id(); } +if ($compose) { + cleanup_compose_files(); +} + +sub cleanup_compose_files() { + unlink($compose_filename, $compose_filename . ".final"); + +} + + sub unique_email_list(@) { my %seen;