Merge branch 'master' of .

This commit is contained in:
Junio C Hamano 2005-09-04 15:47:28 -07:00
commit f5f2c52bb0
16 changed files with 374 additions and 35 deletions

View File

@ -8,6 +8,7 @@ ARTICLES += cvs-migration
ARTICLES += diffcore ARTICLES += diffcore
ARTICLES += howto-index ARTICLES += howto-index
ARTICLES += repository-layout ARTICLES += repository-layout
ARTICLES += hooks
# with their own formatting rules. # with their own formatting rules.
SP_ARTICLES = glossary howto/revert-branch-rebase SP_ARTICLES = glossary howto/revert-branch-rebase

View File

@ -64,6 +64,12 @@ OPTIONS
generated "Signed-off-by" line based on your committer generated "Signed-off-by" line based on your committer
identity. identity.
SEE ALSO
--------
link:git-applypatch.html[git-applypatch].
Author Author
------ ------
Written by Linus Torvalds <torvalds@osdl.org> Written by Linus Torvalds <torvalds@osdl.org>

View File

@ -16,6 +16,10 @@ Takes three files <msg>, <patch>, and <info> prepared from an
e-mail message by 'git-mailinfo', and creates a commit. It is e-mail message by 'git-mailinfo', and creates a commit. It is
usually not necessary to use this command directly. usually not necessary to use this command directly.
This command can run `applypatch-msg`, `pre-applypatch`, and
`post-applypatch` hooks. See link:hooks.html[hooks] for more
information.
OPTIONS OPTIONS
------- -------

View File

@ -8,7 +8,7 @@ git-commit-script - Record your changes
SYNOPSIS SYNOPSIS
-------- --------
'git commit' [-a] [-s] [-v] [(-c | -C) <commit> | -F <file> | -m <msg>] <file>... 'git commit' [-a] [-s] [-v] [(-c | -C) <commit> | -F <file> | -m <msg>] [-e] <file>...
DESCRIPTION DESCRIPTION
----------- -----------
@ -17,6 +17,10 @@ Updates the index file for given paths, or all modified files if
VISUAL and EDITOR environment variables to edit the commit log VISUAL and EDITOR environment variables to edit the commit log
message. message.
This command can run `commit-msg`, `pre-commit`, and
`post-commit` hooks. See link:hooks.html[hooks] for more
information.
OPTIONS OPTIONS
------- -------
-a:: -a::
@ -47,8 +51,14 @@ OPTIONS
has a SP character immediately followed by a TAB has a SP character immediately followed by a TAB
character. character.
-e::
The message taken from file with `-F`, command line with
`-m`, and from file with `-C` are usually used as the
commit log message unmodified. This option lets you
further edit the message taken from these sources.
<file>...:: <file>...::
Update specified paths in the index file. Update specified paths in the index file before committing.
Author Author

View File

@ -88,7 +88,7 @@ For an unmerged path, instead of recording a single mode/SHA1 pair,
the dircache records up to three such pairs; one from tree O in stage the dircache records up to three such pairs; one from tree O in stage
1, A in stage 2, and B in stage 3. This information can be used by 1, A in stage 2, and B in stage 3. This information can be used by
the user (or the porcelain) to see what should eventually be recorded at the the user (or the porcelain) to see what should eventually be recorded at the
path. (see read-cache for more information on state) path. (see git-read-tree for more information on state)
Exclude Patterns Exclude Patterns
@ -180,7 +180,7 @@ An example:
See Also See Also
-------- --------
link:read-cache.html[read-cache] link:git-read-tree.html[git-read-tree]
Author Author

View File

@ -77,6 +77,12 @@ OPTIONS
<directory>:: <directory>::
The repository to sync into. The repository to sync into.
SEE ALSO
--------
link:git-send-pack.html[git-send-pack]
Author Author
------ ------
Written by Linus Torvalds <torvalds@osdl.org> Written by Linus Torvalds <torvalds@osdl.org>

View File

@ -24,8 +24,27 @@ OPTIONS
------- -------
--force:: --force::
Update the info files even when they do not appear Update the info files from scratch.
stale.
OUTPUT
------
Currently the command updates the following files. Please see
link:repository-layout.html[repository-layout] for description
of what they are for:
* objects/info/packs
* info/refs
* info/rev-cache
BUGS
----
When you remove an existing ref, the command fails to update
info/refs file unless `--force` flag is given.
Author Author

128
Documentation/hooks.txt Normal file
View File

@ -0,0 +1,128 @@
Hooks used by GIT
=================
v0.99.6, Sep 2005
Hooks are little scripts you can place in `$GIT_DIR/hooks`
directory to trigger action at certain points. When
`git-init-db` is run, a handful example hooks are copied in the
`hooks` directory of the new repository, but by default they are
all disabled. To enable a hook, make it executable with `chmod
+x`.
This document describes the currently defined hooks.
applypatch-msg
--------------
This hook is invoked by `git-applypatch` script, which is
typically invoked by `git-applymbox`. It takes a single
parameter, the name of the file that holds the proposed commit
log message. Exiting with non-zero status causes the
'git-applypatch' to abort before applying the patch.
The hook is allowed to edit the message file in place, and can
be used to normalize the message into some project standard
format (if the project has one). It can also be used to refuse
the commit after inspecting the message file.
The default applypatch-msg hook, when enabled, runs the
commit-msg hook, if the latter is enabled.
pre-applypatch
--------------
This hook is invoked by `git-applypatch` script, which is
typically invoked by `git-applymbox`. It takes no parameter,
and is invoked after the patch is applied, but before a commit
is made. Exiting with non-zero status causes the working tree
after application of the patch not committed.
It can be used to inspect the current working tree and refuse to
make a commit if it does not pass certain test.
The default pre-applypatch hook, when enabled, runs the
pre-commit hook, if the latter is enabled.
post-applypatch
---------------
This hook is invoked by `git-applypatch` script, which is
typically invoked by `git-applymbox`. It takes no parameter,
and is invoked after the patch is applied and a commit is made.
This hook is meant primarily for notification, and cannot affect
the outcome of `git-applypatch`.
pre-commit
----------
This hook is invoked by `git-commit-script`, and can be bypassed
with `--no-verify` option. It takes no parameter, and is
invoked before obtaining the proposed commit log message and
making a commit. Exiting with non-zero status from this script
causes the `git-commit-script` to abort.
The default pre-commit hook, when enabled, catches introduction
of lines with trailing whitespaces and aborts the commit when
a such line is found.
commit-msg
----------
This hook is invoked by `git-commit-script`, and can be bypassed
with `--no-verify` option. It takes a single parameter, the
name of the file that holds the proposed commit log message.
Exiting with non-zero status causes the `git-commit-script` to
abort.
The hook is allowed to edit the message file in place, and can
be used to normalize the message into some project standard
format (if the project has one). It can also be used to refuse
the commit after inspecting the message file.
The default commit-msg hook, when enabled, detects duplicate
Signed-off-by: lines, and aborts the commit when one is found.
post-commit
-----------
This hook is invoked by `git-commit-script`. It takes no
parameter, and is invoked after a commit is made.
This hook is meant primarily for notification, and cannot affect
the outcome of `git-commit-script`.
The default post-commit hook, when enabled, demonstrates how to
send out a commit notification e-mail.
update
------
This hook is invoked by `git-receive-pack`, which is invoked
when a `git push` is done against the repository. It takes
three parameters, name of the ref being updated, old object name
stored in the ref, and the new objectname to be stored in the
ref. Exiting with non-zero status from this hook prevents
`git-receive-pack` from updating the ref.
This can be used to prevent 'forced' update on certain refs by
making sure that the object name is a commit object that is a
descendant of the commit object named by the old object name.
Another use suggested on the mailing list is to use this hook to
implement access control which is finer grained than the one
based on filesystem group.
post-update
-----------
This hook is invoked by `git-receive-pack`, which is invoked
when a `git push` is done against the repository. It takes
variable number of parameters; each of which is the name of ref
that was actually updated.
This hook is meant primarily for notification, and cannot affect
the outcome of `git-receive-pack`.
The default post-update hook, when enabled, runs
`git-update-server-info` to keep the information used by dumb
transport up-to-date.

10
apply.c
View File

@ -672,9 +672,13 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
added++; added++;
newlines--; newlines--;
break; break;
/* We allow "\ No newline at end of file" */
/* We allow "\ No newline at end of file". Depending
* on locale settings when the patch was produced we
* don't know what this line looks like. The only
* thing we do know is that it begins with "\ ". */
case '\\': case '\\':
if (len < 12 || memcmp(line, "\\ No newline", 12)) if (len < 12 || memcmp(line, "\\ ", 2))
return -1; return -1;
break; break;
} }
@ -683,7 +687,7 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
* it in the above loop because we hit oldlines == newlines == 0 * it in the above loop because we hit oldlines == newlines == 0
* before seeing it. * before seeing it.
*/ */
if (12 < size && !memcmp(line, "\\ No newline", 12)) if (12 < size && !memcmp(line, "\\ ", 2))
offset += linelen(line, size); offset += linelen(line, size);
patch->lines_added += added; patch->lines_added += added;

View File

@ -327,7 +327,7 @@ extern int get_ack(int fd, unsigned char *result_sha1);
extern struct ref **get_remote_heads(int in, struct ref **list, int nr_match, char **match); extern struct ref **get_remote_heads(int in, struct ref **list, int nr_match, char **match);
extern struct packed_git *parse_pack_index(unsigned char *sha1); extern struct packed_git *parse_pack_index(unsigned char *sha1);
extern struct packed_git *parse_pack_index_file(unsigned char *sha1, extern struct packed_git *parse_pack_index_file(const unsigned char *sha1,
char *idx_path); char *idx_path);
extern void prepare_packed_git(void); extern void prepare_packed_git(void);

View File

@ -49,12 +49,12 @@ $SIG{'PIPE'}="IGNORE";
$ENV{'TZ'}="UTC"; $ENV{'TZ'}="UTC";
our($opt_h,$opt_v, $opt_T, our($opt_h,$opt_v, $opt_T,
$opt_C,$opt_t, $opt_i); $opt_C,$opt_t);
sub usage() { sub usage() {
print STDERR <<END; print STDERR <<END;
Usage: ${\basename $0} # fetch/update GIT from Arch Usage: ${\basename $0} # fetch/update GIT from Arch
[ -h ] [ -v ] [ -i ] [ -T ] [ -h ] [ -v ] [ -T ]
[ -C GIT_repository ] [ -t tempdir ] [ -C GIT_repository ] [ -t tempdir ]
repository/arch-branch [ repository/arch-branch] ... repository/arch-branch [ repository/arch-branch] ...
END END
@ -173,21 +173,19 @@ foreach my $root (@arch_roots) {
## TODO cleanup irrelevant patches ## TODO cleanup irrelevant patches
## and put an initial import ## and put an initial import
## or a full tag ## or a full tag
my $import = 0;
if ($opt_i) { # initial import unless (-d '.git') { # initial import
if ($psets[0]{type} eq 'i' || $psets[0]{type} eq 't') { if ($psets[0]{type} eq 'i' || $psets[0]{type} eq 't') {
print "Starting import from $psets[0]{id}\n"; print "Starting import from $psets[0]{id}\n";
`git-init-db`;
die $! if $?;
$import = 1;
} else { } else {
die "Need to start from an import or a tag -- cannot use $psets[0]{id}"; die "Need to start from an import or a tag -- cannot use $psets[0]{id}";
} }
`git-init-db`;
die $! if $?;
} }
# process # process patchsets
my $lastbranch = branchname($psets[0]{id}); # only good for initial import
my $importseen = $opt_i ? 0 : 1; # start at 1 if opt_i
foreach my $ps (@psets) { foreach my $ps (@psets) {
$ps->{branch} = branchname($ps->{id}); $ps->{branch} = branchname($ps->{id});
@ -202,13 +200,21 @@ foreach my $ps (@psets) {
die $! if $?; die $! if $?;
# #
# create the branch if needed # skip commits already in repo
# #
if ($ps->{type} eq 'i' && $importseen) { if (ptag($ps->{id})) {
die "Should not have more than one 'Initial import' per GIT import"; $opt_v && print "Skipping already imported: $ps->{id}\n";
next;
} }
unless ($opt_i && !$importseen) { # skip for first commit #
# create the branch if needed
#
if ($ps->{type} eq 'i' && !$import) {
die "Should not have more than one 'Initial import' per GIT import: $ps->{id}";
}
unless ($import) { # skip for import
if ( -e ".git/refs/heads/$ps->{branch}") { if ( -e ".git/refs/heads/$ps->{branch}") {
# we know about this branch # we know about this branch
`git checkout $ps->{branch}`; `git checkout $ps->{branch}`;
@ -221,17 +227,24 @@ foreach my $ps (@psets) {
# find where we are supposed to branch from # find where we are supposed to branch from
`git checkout -b $ps->{branch} $branchpoint`; `git checkout -b $ps->{branch} $branchpoint`;
# If we trust Arch with the fact that this is just
# a tag, and it does not affect the state of the tree
# then we just tag and move on
tag($ps->{id}, $branchpoint);
ptag($ps->{id}, $branchpoint);
print " * Tagged $ps->{id} at $branchpoint\n";
next;
} }
die $! if $?; die $! if $?;
} }
# #
# Apply the import/changeset/merge into the working tree # Apply the import/changeset/merge into the working tree
# #
if ($ps->{type} eq 'i' || $ps->{type} eq 't') { if ($ps->{type} eq 'i' || $ps->{type} eq 't') {
$importseen = 1;
apply_import($ps) or die $!; apply_import($ps) or die $!;
$import=0;
} elsif ($ps->{type} eq 's') { } elsif ($ps->{type} eq 's') {
apply_cset($ps); apply_cset($ps);
} }
@ -577,8 +590,6 @@ sub ptag {
} else { # read } else { # read
# if the tag isn't there, return 0 # if the tag isn't there, return 0
unless ( -s ".git/archimport/tags/$tag") { unless ( -s ".git/archimport/tags/$tag") {
warn "Could not find tag $tag -- perhaps it isn't in the repos we have?\n"
if $opt_v;
return 0; return 0;
} }
open(C,"<.git/archimport/tags/$tag") open(C,"<.git/archimport/tags/$tag")

View File

@ -17,7 +17,7 @@ void prefetch(unsigned char *sha1)
static struct packed_git *packs = NULL; static struct packed_git *packs = NULL;
void setup_index(unsigned char *sha1) static void setup_index(unsigned char *sha1)
{ {
struct packed_git *new_pack; struct packed_git *new_pack;
char filename[PATH_MAX]; char filename[PATH_MAX];
@ -30,7 +30,7 @@ void setup_index(unsigned char *sha1)
packs = new_pack; packs = new_pack;
} }
int setup_indices() static int setup_indices(void)
{ {
DIR *dir; DIR *dir;
struct dirent *de; struct dirent *de;
@ -49,7 +49,7 @@ int setup_indices()
return 0; return 0;
} }
int copy_file(const char *source, const char *dest, const char *hex) static int copy_file(const char *source, const char *dest, const char *hex)
{ {
if (use_link) { if (use_link) {
if (!link(source, dest)) { if (!link(source, dest)) {
@ -97,7 +97,7 @@ int copy_file(const char *source, const char *dest, const char *hex)
return -1; return -1;
} }
int fetch_pack(unsigned char *sha1) static int fetch_pack(const unsigned char *sha1)
{ {
struct packed_git *target; struct packed_git *target;
char filename[PATH_MAX]; char filename[PATH_MAX];
@ -125,7 +125,7 @@ int fetch_pack(unsigned char *sha1)
return 0; return 0;
} }
int fetch_file(unsigned char *sha1) static int fetch_file(const unsigned char *sha1)
{ {
static int object_name_start = -1; static int object_name_start = -1;
static char filename[PATH_MAX]; static char filename[PATH_MAX];

View File

@ -34,9 +34,10 @@ void *patch_delta(void *src_buf, unsigned long src_size,
/* now the result size */ /* now the result size */
size = get_delta_hdr_size(&data); size = get_delta_hdr_size(&data);
dst_buf = malloc(size); dst_buf = malloc(size + 1);
if (!dst_buf) if (!dst_buf)
return NULL; return NULL;
dst_buf[size] = 0;
out = dst_buf; out = dst_buf;
while (data < top) { while (data < top) {

View File

@ -487,7 +487,7 @@ struct packed_git *parse_pack_index(unsigned char *sha1)
return parse_pack_index_file(sha1, path); return parse_pack_index_file(sha1, path);
} }
struct packed_git *parse_pack_index_file(unsigned char *sha1, char *idx_path) struct packed_git *parse_pack_index_file(const unsigned char *sha1, char *idx_path)
{ {
struct packed_git *p; struct packed_git *p;
unsigned long idx_size; unsigned long idx_size;

148
t/t4112-apply-renames.sh Executable file
View File

@ -0,0 +1,148 @@
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
#
test_description='git-apply should not get confused with rename/copy.
'
. ./test-lib.sh
# setup
mkdir -p include/arch/x86_64/klibc klibc/arch/x86_64/include/klibc
cat >include/arch/x86_64/klibc/archsetjmp.h <<\EOF
/*
* arch/x86_64/include/klibc/archsetjmp.h
*/
#ifndef _KLIBC_ARCHSETJMP_H
#define _KLIBC_ARCHSETJMP_H
struct __jmp_buf {
unsigned long __rbx;
unsigned long __rsp;
unsigned long __rbp;
unsigned long __r12;
unsigned long __r13;
unsigned long __r14;
unsigned long __r15;
unsigned long __rip;
};
typedef struct __jmp_buf jmp_buf[1];
#endif /* _SETJMP_H */
EOF
cat >klibc/arch/x86_64/include/klibc/archsetjmp.h <<\EOF
/*
* arch/x86_64/include/klibc/archsetjmp.h
*/
#ifndef _KLIBC_ARCHSETJMP_H
#define _KLIBC_ARCHSETJMP_H
struct __jmp_buf {
unsigned long __rbx;
unsigned long __rsp;
unsigned long __rbp;
unsigned long __r12;
unsigned long __r13;
unsigned long __r14;
unsigned long __r15;
unsigned long __rip;
};
typedef struct __jmp_buf jmp_buf[1];
#endif /* _SETJMP_H */
EOF
cat >patch <<\EOF
diff --git a/klibc/arch/x86_64/include/klibc/archsetjmp.h b/include/arch/cris/klibc/archsetjmp.h
similarity index 76%
copy from klibc/arch/x86_64/include/klibc/archsetjmp.h
copy to include/arch/cris/klibc/archsetjmp.h
--- a/klibc/arch/x86_64/include/klibc/archsetjmp.h
+++ b/include/arch/cris/klibc/archsetjmp.h
@@ -1,21 +1,24 @@
/*
- * arch/x86_64/include/klibc/archsetjmp.h
+ * arch/cris/include/klibc/archsetjmp.h
*/
#ifndef _KLIBC_ARCHSETJMP_H
#define _KLIBC_ARCHSETJMP_H
struct __jmp_buf {
- unsigned long __rbx;
- unsigned long __rsp;
- unsigned long __rbp;
- unsigned long __r12;
- unsigned long __r13;
- unsigned long __r14;
- unsigned long __r15;
- unsigned long __rip;
+ unsigned long __r0;
+ unsigned long __r1;
+ unsigned long __r2;
+ unsigned long __r3;
+ unsigned long __r4;
+ unsigned long __r5;
+ unsigned long __r6;
+ unsigned long __r7;
+ unsigned long __r8;
+ unsigned long __sp;
+ unsigned long __srp;
};
typedef struct __jmp_buf jmp_buf[1];
-#endif /* _SETJMP_H */
+#endif /* _KLIBC_ARCHSETJMP_H */
diff --git a/klibc/arch/x86_64/include/klibc/archsetjmp.h b/include/arch/m32r/klibc/archsetjmp.h
similarity index 66%
rename from klibc/arch/x86_64/include/klibc/archsetjmp.h
rename to include/arch/m32r/klibc/archsetjmp.h
--- a/klibc/arch/x86_64/include/klibc/archsetjmp.h
+++ b/include/arch/m32r/klibc/archsetjmp.h
@@ -1,21 +1,21 @@
/*
- * arch/x86_64/include/klibc/archsetjmp.h
+ * arch/m32r/include/klibc/archsetjmp.h
*/
#ifndef _KLIBC_ARCHSETJMP_H
#define _KLIBC_ARCHSETJMP_H
struct __jmp_buf {
- unsigned long __rbx;
- unsigned long __rsp;
- unsigned long __rbp;
+ unsigned long __r8;
+ unsigned long __r9;
+ unsigned long __r10;
+ unsigned long __r11;
unsigned long __r12;
unsigned long __r13;
unsigned long __r14;
unsigned long __r15;
- unsigned long __rip;
};
typedef struct __jmp_buf jmp_buf[1];
-#endif /* _SETJMP_H */
+#endif /* _KLIBC_ARCHSETJMP_H */
EOF
find include klibc -type f -print | xargs git-update-cache --add --
test_expect_success 'check rename/copy patch' 'git-apply --check patch'
test_expect_success 'apply rename/copy patch' 'git-apply --index patch'
test_done

View File

@ -68,7 +68,8 @@ do
i="$1" i="$1"
case "$resume,$continue" in case "$resume,$continue" in
f,$i) resume=t;; f,$i) resume=t;;
f,*) continue;; f,*) shift
continue;;
*) *)
git-mailinfo $keep_subject $utf8 \ git-mailinfo $keep_subject $utf8 \
.dotest/msg .dotest/patch <$i >.dotest/info || exit 1 .dotest/msg .dotest/patch <$i >.dotest/info || exit 1