diff --git a/Documentation/core-tutorial.txt b/Documentation/core-tutorial.txt index d1360ecde2..5a831adf43 100644 --- a/Documentation/core-tutorial.txt +++ b/Documentation/core-tutorial.txt @@ -1,5 +1,5 @@ -A short git tutorial -==================== +A git core tutorial for developers +================================== Introduction ------------ diff --git a/Documentation/everyday.txt b/Documentation/everyday.txt index 4b56370937..2ad2d61300 100644 --- a/Documentation/everyday.txt +++ b/Documentation/everyday.txt @@ -66,7 +66,7 @@ $ git prune <4> <1> running without "--full" is usually cheap and assures the repository health reasonably well. <2> check how many loose objects there are and how much -diskspace is wasted by not repacking. +disk space is wasted by not repacking. <3> without "-a" repacks incrementally. repacking every 4-5MB of loose objects accumulation may be a good rule of thumb. <4> after repack, prune removes the duplicate loose objects. @@ -86,7 +86,7 @@ Individual Developer (Standalone)[[Individual Developer (Standalone)]] ---------------------------------------------------------------------- A standalone individual developer does not exchange patches with -other poeple, and works alone in a single repository, using the +other people, and works alone in a single repository, using the following commands. * gitlink:git-show-branch[1] to see where you are. @@ -370,7 +370,7 @@ Examples Run git-daemon to serve /pub/scm from inetd.:: + ------------ -$ grep git /etc/inet.conf +$ grep git /etc/inetd.conf git stream tcp nowait nobody \ /usr/bin/git-daemon git-daemon --inetd --syslog --export-all /pub/scm ------------ diff --git a/Documentation/tutorial-2.txt b/Documentation/tutorial-2.txt index 08d3453e5c..9c9500c1f1 100644 --- a/Documentation/tutorial-2.txt +++ b/Documentation/tutorial-2.txt @@ -377,7 +377,7 @@ At this point you should know everything necessary to read the man pages for any of the git commands; one good place to start would be with the commands mentioned in link:everyday.html[Everyday git]. You should be able to find any unknown jargon in the -link:glossary.html[Glosssay]. +link:glossary.html[Glossary]. The link:cvs-migration.html[CVS migration] document explains how to import a CVS repository into git, and shows how to use git in a diff --git a/Documentation/tutorial.txt b/Documentation/tutorial.txt index 79781adf4f..039a8598e3 100644 --- a/Documentation/tutorial.txt +++ b/Documentation/tutorial.txt @@ -429,16 +429,24 @@ $ gitk --since="2 weeks ago" drivers/ ------------------------------------- allows you to browse any commits from the last 2 weeks of commits -that modified files under the "drivers" directory. +that modified files under the "drivers" directory. (Note: you can +adjust gitk's fonts by holding down the control key while pressing +"-" or "+".) Finally, most commands that take filenames will optionally allow you to precede any filename by a commit, to specify a particular version -fo the file: +of the file: ------------------------------------- $ git diff v2.5:Makefile HEAD:Makefile.in ------------------------------------- +You can also use "git cat-file -p" to see any such file: + +------------------------------------- +$ git cat-file -p v2.5:Makefile +------------------------------------- + Next Steps ---------- diff --git a/contrib/git-svn/git-svn.perl b/contrib/git-svn/git-svn.perl index b3e0684c44..aac877974d 100755 --- a/contrib/git-svn/git-svn.perl +++ b/contrib/git-svn/git-svn.perl @@ -567,7 +567,6 @@ sub precommit_check { sub svn_checkout_tree { my ($svn_rev, $treeish) = @_; my $from = file_to_s("$REV_DIR/$svn_rev"); - assert_svn_wc_clean($svn_rev); assert_tree($from); print "diff-tree $from $treeish\n"; my $pid = open my $diff_fh, '-|'; diff --git a/contrib/git-svn/t/t0001-contrib-git-svn-props.sh b/contrib/git-svn/t/t0001-contrib-git-svn-props.sh index 6fa7889e9a..23a5a2a223 100644 --- a/contrib/git-svn/t/t0001-contrib-git-svn-props.sh +++ b/contrib/git-svn/t/t0001-contrib-git-svn-props.sh @@ -20,9 +20,10 @@ a_empty_cr= a_empty_crlf= cd import - cat >> kw.c <<'' + cat >> kw.c <<\EOF /* Make it look like somebody copied a file from CVS into SVN: */ /* $Id: kw.c,v 1.1.1.1 1994/03/06 00:00:00 eric Exp $ */ +EOF printf "Hello\r\nWorld\r\n" > crlf a_crlf=`git-hash-object -w crlf` diff --git a/git-clean.sh b/git-clean.sh index bb56264e04..3834323bcf 100755 --- a/git-clean.sh +++ b/git-clean.sh @@ -19,8 +19,8 @@ ignored= ignoredonly= cleandir= quiet= -rmf="rm -f" -rmrf="rm -rf" +rmf="rm -f --" +rmrf="rm -rf --" rm_refuse="echo Not removing" echo1="echo" diff --git a/git-send-email.perl b/git-send-email.perl index 312a4ea2aa..0e368fff0c 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -37,7 +37,8 @@ my $compose_filename = ".msg.$$"; # Variables we fill in automatically, or via prompting: -my (@to,@cc,@initial_cc,$initial_reply_to,$initial_subject,@files,$from,$compose,$time); +my (@to,@cc,@initial_cc,@bcclist, + $initial_reply_to,$initial_subject,@files,$from,$compose,$time); # Behavior modification variables my ($chain_reply_to, $quiet, $suppress_from, $no_signed_off_cc) = (1, 0, 0, 0); @@ -56,6 +57,7 @@ "subject=s" => \$initial_subject, "to=s" => \@to, "cc=s" => \@initial_cc, + "bcc=s" => \@bcclist, "chain-reply-to!" => \$chain_reply_to, "smtp-server=s" => \$smtp_server, "compose" => \$compose, @@ -160,6 +162,7 @@ sub expand_aliases { @to = expand_aliases(@to); @initial_cc = expand_aliases(@initial_cc); +@bcclist = expand_aliases(@bcclist); if (!defined $initial_subject && $compose) { do { @@ -269,6 +272,9 @@ sub expand_aliases { --cc Specify an initial "Cc:" list for the entire series of emails. + --bcc Specify a list of email addresses that should be Bcc: + on all the emails. + --compose Use \$EDITOR to edit an introductory message for the patch series. @@ -303,7 +309,7 @@ sub expand_aliases { } # Variables we set as part of the loop over files -our ($message_id, $cc, %mail, $subject, $reply_to, $message); +our ($message_id, $cc, %mail, $subject, $reply_to, $references, $message); sub extract_valid_address { my $address = shift; @@ -316,7 +322,11 @@ sub extract_valid_address { } else { # less robust/correct than the monster regexp in Email::Valid, # but still does a 99% job, and one less dependency - return ($address =~ /([^\"<>\s]+@[^<>\s]+)/); + my $cleaned_address; + if ($address =~ /([^\"<>\s]+@[^<>\s]+)/) { + $cleaned_address = $1; + } + return $cleaned_address; } } @@ -348,7 +358,7 @@ sub send_message { my @recipients = unique_email_list(@to); my $to = join (",\n\t", @recipients); - @recipients = unique_email_list(@recipients,@cc); + @recipients = unique_email_list(@recipients,@cc,@bcclist); my $date = strftime('%a, %d %b %Y %H:%M:%S %z', localtime($time++)); my $gitversion = '@@GIT_VERSION@@'; if ($gitversion =~ m/..GIT_VERSION../) { @@ -367,13 +377,19 @@ sub send_message Message-Id: $message_id X-Mailer: git-send-email $gitversion "; - $header .= "In-Reply-To: $reply_to\n" if $reply_to; + if ($reply_to) { + + $header .= "In-Reply-To: $reply_to\n"; + $header .= "References: $references\n"; + } if ($smtp_server =~ m#^/#) { my $pid = open my $sm, '|-'; defined $pid or die $!; if (!$pid) { - exec($smtp_server,'-i',@recipients) or die $!; + exec($smtp_server,'-i', + map { scalar extract_valid_address($_) } + @recipients) or die $!; } print $sm "$header\n$message"; close $sm or die $?; @@ -406,6 +422,7 @@ sub send_message } $reply_to = $initial_reply_to; +$references = $initial_reply_to || ''; make_message_id(); $subject = $initial_subject; @@ -482,6 +499,11 @@ sub send_message # set up for the next message if ($chain_reply_to || length($reply_to) == 0) { $reply_to = $message_id; + if (length $references > 0) { + $references .= " $message_id"; + } else { + $references = "$message_id"; + } } make_message_id(); } diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh new file mode 100755 index 0000000000..a61da1efbd --- /dev/null +++ b/t/t9001-send-email.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +test_description='git-send-email' +. ./test-lib.sh + +PROG='git send-email' +test_expect_success \ + 'prepare reference tree' \ + 'echo "1A quick brown fox jumps over the" >file && + echo "lazy dog" >>file && + git add file + GIT_AUTHOR_NAME="A" git commit -a -m "Initial."' + +test_expect_success \ + 'Setup helper tool' \ + '(echo "#!/bin/sh" + echo shift + echo for a + echo do + echo " echo \"!\$a!\"" + echo "done >commandline" + echo "cat > msgtxt" + ) >fake.sendmail + chmod +x ./fake.sendmail + git add fake.sendmail + GIT_AUTHOR_NAME="A" git commit -a -m "Second."' + +test_expect_success \ + 'Extract patches and send' \ + 'git format-patch -n HEAD^1 + git send-email -from="Example " --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" ./0001*txt' + +cat >expected <<\EOF +!nobody@example.com! +!author@example.com! +EOF +test_expect_success \ + 'Verify commandline' \ + 'diff commandline expected' + +test_done