Merge refs/heads/master from .

This commit is contained in:
Junio C Hamano 2005-08-28 17:57:45 -07:00
commit 933693da77
11 changed files with 520 additions and 51 deletions

View File

@ -73,14 +73,25 @@ MIME-attached change being accepted, but it makes it more likely
that it will be postponed. that it will be postponed.
Exception: If your mailer is mangling patches then someone may ask Exception: If your mailer is mangling patches then someone may ask
you to re-send them using MIME. you to re-send them using MIME, that is OK.
Note that your maintainer does not subscribe to the git mailing Do not PGP sign your patch, at least for now. Most likely, your
list (he reads it via mail-to-news gateway). If your patch is maintainer or other people on the list would not have your PGP
for discussion first, send it "To:" the mailing list, and key and would not bother obtaining it anyway. Your patch is not
optoinally "cc:" him. If it is trivially correct or after list judged by who you are; a good patch from an unknown origin has a
discussion reached consensus, send it "To:" the maintainer and far better chance of being accepted than a patch from a known,
optionally "cc:" the list. respected origin that is done poorly or does incorrect things.
If you really really really really want to do a PGP signed
patch, format it as "multipart/signed", not a text/plain message
that starts with '-----BEGIN PGP SIGNED MESSAGE-----'. That is
not a text/plain, it's something else.
Note that your maintainer does not necessarily read everything
on the git mailing list. If your patch is for discussion first,
send it "To:" the mailing list, and optionally "cc:" him. If it
is trivially correct or after the list reached a consensus, send
it "To:" the maintainer and optionally "cc:" the list.
(6) Sign your work (6) Sign your work
@ -128,3 +139,152 @@ then you just add a line saying
Some people also put extra tags at the end. They'll just be ignored for Some people also put extra tags at the end. They'll just be ignored for
now, but you can do this to mark internal company procedures or just now, but you can do this to mark internal company procedures or just
point out some special detail about the sign-off. point out some special detail about the sign-off.
------------------------------------------------
MUA specific hints
Some of patches I receive or pick up from the list share common
patterns of breakage. Please make sure your MUA is set up
properly not to corrupt whitespaces. Here are two common ones
I have seen:
* Empty context lines that do not have _any_ whitespace.
* Non empty context lines that have one extra whitespace at the
beginning.
One test you could do yourself if your MUA is set up correctly is:
* Send the patch to yourself, exactly the way you would, except
To: and Cc: lines, which would not contain the list and
maintainer address.
* Save that patch to a file in UNIX mailbox format. Call it say
a.patch.
* Try to apply to the tip of the "master" branch from the
git.git public repository:
$ git fetch http://kernel.org/pub/scm/git/git.git master:test-apply
$ git checkout test-apply
$ git reset --hard
$ git applymbox a.patch
If it does not apply correctly, there can be various reasons.
* Your patch itself does not apply cleanly. That is _bad_ but
does not have much to do with your MUA. Please rebase the
patch appropriately.
* Your MUA corrupted your patch; applymbox would complain that
the patch does not apply. Look at .dotest/ subdirectory and
see what 'patch' file contains and check for the common
corruption patterns mentioned above.
* While you are at it, check what are in 'info' and
'final-commit' files as well. If what is in 'final-commit' is
not exactly what you would want to see in the commit log
message, it is very likely that your maintainer would end up
hand editing the log message when he applies your patch.
Things like "Hi, this is my first patch.\n", if you really
want to put in the patch e-mail, should come after the
three-dash line that signals the end of the commit message.
Pine
----
(Johannes Schindelin)
I don't know how many people still use pine, but for those poor
souls it may be good to mention that the quell-flowed-text is
needed for recent versions.
... the "no-strip-whitespace-before-send" option, too. AFAIK it
was introduced in 4.60.
(Linus Torvalds)
And 4.58 needs at least this.
---
diff-tree 8326dd8350be64ac7fc805f6563a1d61ad10d32c (from e886a61f76edf5410573e92e38ce22974f9c40f1)
Author: Linus Torvalds <torvalds@g5.osdl.org>
Date: Mon Aug 15 17:23:51 2005 -0700
Fix pine whitespace-corruption bug
There's no excuse for unconditionally removing whitespace from
the pico buffers on close.
diff --git a/pico/pico.c b/pico/pico.c
--- a/pico/pico.c
+++ b/pico/pico.c
@@ -219,7 +219,9 @@ PICO *pm;
switch(pico_all_done){ /* prepare for/handle final events */
case COMP_EXIT : /* already confirmed */
packheader();
+#if 0
stripwhitespace();
+#endif
c |= COMP_EXIT;
break;
Thunderbird
-----------
(A Large Angry SCM)
Here are some hints on how to successfully submit patches inline using
Thunderbird. [*3*]
This recipe appears to work with the current [*1*] Thunderbird from Suse.
The following Thunderbird extensions are needed:
AboutConfig 0.5
http://aboutconfig.mozdev.org/
External Editor 0.5.4
http://extensionroom.mozdev.org/more-info/exteditor
1) Prepare the patch as a text file using your method of choice.
2) Before opening a compose window, use Edit->Account Settings to
uncheck the "Compose messages in HTML format" setting in the
"Composition & Addressing" panel of the account to be used to send the
patch. [*2*]
3) In the main Thunderbird window, _before_ you open the compose window
for the patch, use Tools->about:config to set the following to the
indicated values:
mailnews.send_plaintext_flowed => false
mailnews.wraplength => 999
4) Open a compose window and click the external editor icon.
5) In the external editor window, read in the patch file and exit the
editor normally.
6) Back in the compose window: Add whatever other text you wish to the
message, complete the addressing and subject fields, and press send.
7) Optionally, undo the about:config/account settings changes made in
steps 2 & 3.
[Footnotes]
*1* Version 1.0 (20041207) from the MozillaThunderbird-1.0-5 rpm of Suse
9.3 professional updates.
*2* It may be possible to do this with about:config and the following
settings but I haven't tried, yet.
mail.html_compose => false
mail.identity.default.compose_html => false
mail.identity.id?.compose_html => false
*3* Even after following these hints, Thunderbird will still trim
trailing whitespace from each line. I currently have no work around for
for this issue.

View File

@ -3,26 +3,24 @@ git-mailsplit(1)
NAME NAME
---- ----
git-mailsplit - Some git command not yet documented. git-mailsplit - Totally braindamaged mbox splitter program.
SYNOPSIS SYNOPSIS
-------- --------
'git-mailsplit' [ --option ] <args>... 'git-mailsplit' <mbox> <directory>
DESCRIPTION DESCRIPTION
----------- -----------
Does something not yet documented. Splits a mbox file into a list of files: "0001" "0002" .. in the specified
directory so you can process them further from there.
OPTIONS OPTIONS
------- -------
--option:: <mbox>::
Some option not yet documented. Mbox file to split.
<args>...::
Some argument not yet documented.
<directory>::
Directory in which to place the individual messages.
Author Author
------ ------

View File

@ -3,26 +3,21 @@ git-stripspace(1)
NAME NAME
---- ----
git-stripspace - Some git command not yet documented. git-stripspace - Fileter out empty lines.
SYNOPSIS SYNOPSIS
-------- --------
'git-stripspace' [ --option ] <args>... 'git-stripspace' < <stream>
DESCRIPTION DESCRIPTION
----------- -----------
Does something not yet documented. Remove multiple empty lines, and empty lines at beginning and end.
OPTIONS OPTIONS
------- -------
--option:: <stream>::
Some option not yet documented. Byte stream to act on.
<args>...::
Some argument not yet documented.
Author Author
------ ------

View File

@ -387,7 +387,7 @@ static char *git_header_name(char *line)
default: default:
continue; continue;
case '\n': case '\n':
break; return NULL;
case '\t': case ' ': case '\t': case ' ':
second = name+len; second = name+len;
for (;;) { for (;;) {

View File

@ -195,8 +195,8 @@ else
fi fi
if [ "$?" != "0" -a ! -f $GIT_DIR/MERGE_HEAD ] if [ "$?" != "0" -a ! -f $GIT_DIR/MERGE_HEAD ]
then then
sed -ne '/^#/p' .editmsg rm -f .editmsg
rm .editmsg git-status-script
exit 1 exit 1
fi fi
case "$no_edit" in case "$no_edit" in

View File

@ -26,6 +26,10 @@ do
esac esac
shift shift
done done
case "$#" in
0)
die "Where would you want to push today?" ;;
esac
. git-parse-remote-script . git-parse-remote-script
remote=$(get_remote_url "$@") remote=$(get_remote_url "$@")

View File

@ -11,7 +11,6 @@ die() {
exit 1 exit 1
} }
[ -d "$GIT_DIR" ] && [ -h "$GIT_DIR/HEAD" ] &&
[ -d "$GIT_DIR/refs" ] && [ -d "$GIT_DIR/refs" ] &&
[ -d "$GIT_OBJECT_DIRECTORY" ] &&
[ -d "$GIT_OBJECT_DIRECTORY/00" ] [ -d "$GIT_OBJECT_DIRECTORY/00" ]

View File

@ -1,4 +1,7 @@
#!/bin/sh #!/bin/sh
#
# Copyright (c) 2005 Linus Torvalds
#
. git-sh-setup-script || die "Not a git archive" . git-sh-setup-script || die "Not a git archive"
report () { report () {
@ -28,19 +31,43 @@ report () {
[ "$header" ] [ "$header" ]
} }
branch=`readlink "$GIT_DIR/HEAD"`
case "$branch" in
refs/heads/master) ;;
*) echo "# On branch $branch" ;;
esac
git-update-cache --refresh >/dev/null 2>&1 git-update-cache --refresh >/dev/null 2>&1
git-diff-cache -M --cached HEAD | sed 's/^://' | report "Updated but not checked in" "will commit"
git-diff-cache -M --cached HEAD |
sed 's/^://' |
report "Updated but not checked in" "will commit"
committable="$?" committable="$?"
git-diff-files | sed 's/^://' | report "Changed but not updated" "use git-update-cache to mark for commit"
git-diff-files |
sed 's/^://' |
report "Changed but not updated" "use git-update-cache to mark for commit"
if grep -v '^#' "$GIT_DIR/info/exclude" >/dev/null 2>&1
then
git-ls-files --others \
--exclude-from="$GIT_DIR/info/exclude" \
--exclude-per-directory=.gitignore |
sed -e '
1i\
#\
# Ignored files:\
# (use "git add" to add to commit)\
#
s/^/# /
$a\
#'
fi
if [ "$committable" == "0" ] if [ "$committable" == "0" ]
then then
echo "nothing to commit" echo "nothing to commit"
exit 1 exit 1
fi fi
branch=`readlink "$GIT_DIR/HEAD"`
case "$branch" in
refs/heads/master) ;;
*) echo "#
# On branch $branch" ;;
esac
exit 0 exit 0

31
setup.c
View File

@ -72,6 +72,24 @@ const char **get_pathspec(const char *prefix, char **pathspec)
return (const char **) pathspec; return (const char **) pathspec;
} }
/*
* Test it it looks like we're at the top
* level git directory. We want to see a
*
* - a HEAD symlink and a refs/ directory under ".git"
* - either a .git/objects/ directory _or_ the proper
* GIT_OBJECT_DIRECTORY environment variable
*/
static int is_toplevel_directory(void)
{
struct stat st;
return !lstat(".git/HEAD", &st) &&
S_ISLNK(st.st_mode) &&
!access(".git/refs/", X_OK) &&
(gitenv(DB_ENVIRONMENT) || !access(".git/objects/", X_OK));
}
const char *setup_git_directory(void) const char *setup_git_directory(void)
{ {
static char cwd[PATH_MAX+1]; static char cwd[PATH_MAX+1];
@ -89,17 +107,8 @@ const char *setup_git_directory(void)
offset = len = strlen(cwd); offset = len = strlen(cwd);
for (;;) { for (;;) {
/* if (is_toplevel_directory())
* We always want to see a .git/refs/ subdirectory break;
*/
if (!access(".git/refs/", X_OK)) {
/*
* Then we need either a GIT_OBJECT_DIRECTORY define
* or a .git/objects/ directory
*/
if (gitenv(DB_ENVIRONMENT) || !access(".git/objects/", X_OK))
break;
}
chdir(".."); chdir("..");
do { do {
if (!offset) if (!offset)

176
t/t4109-apply-multifrag.sh Normal file
View File

@ -0,0 +1,176 @@
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
# Copyright (c) 2005 Robert Fitzsimons
#
test_description='git-apply test patches with multiple fragments.
'
. ./test-lib.sh
# setup
cat > patch1.patch <<\EOF
diff --git a/main.c b/main.c
new file mode 100644
--- /dev/null
+++ b/main.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+
+int func(int num);
+void print_int(int num);
+
+int main() {
+ int i;
+
+ for (i = 0; i < 10; i++) {
+ print_int(func(i));
+ }
+
+ return 0;
+}
+
+int func(int num) {
+ return num * num;
+}
+
+void print_int(int num) {
+ printf("%d", num);
+}
+
EOF
cat > patch2.patch <<\EOF
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
@@ -1,7 +1,9 @@
+#include <stdlib.h>
#include <stdio.h>
int func(int num);
void print_int(int num);
+void print_ln();
int main() {
int i;
@@ -10,6 +12,8 @@
print_int(func(i));
}
+ print_ln();
+
return 0;
}
@@ -21,3 +25,7 @@
printf("%d", num);
}
+void print_ln() {
+ printf("\n");
+}
+
EOF
cat > patch3.patch <<\EOF
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
@@ -1,9 +1,7 @@
-#include <stdlib.h>
#include <stdio.h>
int func(int num);
void print_int(int num);
-void print_ln();
int main() {
int i;
@@ -12,8 +10,6 @@
print_int(func(i));
}
- print_ln();
-
return 0;
}
@@ -25,7 +21,3 @@
printf("%d", num);
}
-void print_ln() {
- printf("\n");
-}
-
EOF
cat > patch4.patch <<\EOF
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
@@ -1,13 +1,14 @@
#include <stdio.h>
int func(int num);
-void print_int(int num);
+int func2(int num);
int main() {
int i;
for (i = 0; i < 10; i++) {
- print_int(func(i));
+ printf("%d", func(i));
+ printf("%d", func3(i));
}
return 0;
@@ -17,7 +18,7 @@
return num * num;
}
-void print_int(int num) {
- printf("%d", num);
+int func2(int num) {
+ return num * num * num;
}
EOF
test_expect_success "S = git-apply (1)" \
'git-apply patch1.patch patch2.patch'
mv main.c main.c.git
test_expect_success "S = patch (1)" \
'cat patch1.patch patch2.patch | patch -p1'
test_expect_success "S = cmp (1)" \
'cmp main.c.git main.c'
rm -f main.c main.c.git
test_expect_success "S = git-apply (2)" \
'git-apply patch1.patch patch2.patch patch3.patch'
mv main.c main.c.git
test_expect_success "S = patch (2)" \
'cat patch1.patch patch2.patch patch3.patch | patch -p1'
test_expect_success "S = cmp (2)" \
'cmp main.c.git main.c'
rm -f main.c main.c.git
test_expect_success "S = git-apply (3)" \
'git-apply patch1.patch patch4.patch'
mv main.c main.c.git
test_expect_success "S = patch (3)" \
'cat patch1.patch patch4.patch | patch -p1'
test_expect_success "S = cmp (3)" \
'cmp main.c.git main.c'
test_done

101
t/t4110-apply-scan.sh Normal file
View File

@ -0,0 +1,101 @@
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
# Copyright (c) 2005 Robert Fitzsimons
#
test_description='git-apply test for patches which require scanning forwards and backwards.
'
. ./test-lib.sh
# setup
cat > patch1.patch <<\EOF
diff --git a/new.txt b/new.txt
new file mode 100644
--- /dev/null
+++ b/new.txt
@@ -0,0 +1,12 @@
+a1
+a11
+a111
+a1111
+b1
+b11
+b111
+b1111
+c1
+c11
+c111
+c1111
EOF
cat > patch2.patch <<\EOF
diff --git a/new.txt b/new.txt
--- a/new.txt
+++ b/new.txt
@@ -1,7 +1,3 @@
-a1
-a11
-a111
-a1111
b1
b11
b111
EOF
cat > patch3.patch <<\EOF
diff --git a/new.txt b/new.txt
--- a/new.txt
+++ b/new.txt
@@ -6,6 +6,10 @@
b11
b111
b1111
+b2
+b22
+b222
+b2222
c1
c11
c111
EOF
cat > patch4.patch <<\EOF
diff --git a/new.txt b/new.txt
--- a/new.txt
+++ b/new.txt
@@ -1,3 +1,7 @@
+a1
+a11
+a111
+a1111
b1
b11
b111
EOF
cat > patch5.patch <<\EOF
diff --git a/new.txt b/new.txt
--- a/new.txt
+++ b/new.txt
@@ -10,3 +10,7 @@
c11
c111
c1111
+c2
+c22
+c222
+c2222
EOF
test_expect_success "S = git-apply scan" \
'git-apply patch1.patch patch2.patch patch3.patch patch4.patch patch5.patch'
mv new.txt apply.txt
test_expect_success "S = patch scan" \
'cat patch1.patch patch2.patch patch3.patch patch4.patch patch5.patch | patch'
mv new.txt patch.txt
test_expect_success "S = cmp" \
'cmp apply.txt patch.txt'
test_done