summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/Makefile1
-rw-r--r--Documentation/git-applymbox.txt6
-rw-r--r--Documentation/git-applypatch.txt4
-rw-r--r--Documentation/git-commit-script.txt14
-rw-r--r--Documentation/git-ls-files.txt4
-rw-r--r--Documentation/git-receive-pack.txt6
-rw-r--r--Documentation/git-update-server-info.txt23
-rw-r--r--Documentation/hooks.txt128
-rw-r--r--apply.c10
-rw-r--r--cache.h2
-rwxr-xr-xgit-archimport-script45
-rw-r--r--local-pull.c10
-rw-r--r--patch-delta.c3
-rw-r--r--sha1_file.c2
-rwxr-xr-xt/t4112-apply-renames.sh148
-rwxr-xr-xtools/git-applymbox3
16 files changed, 374 insertions, 35 deletions
diff --git a/Documentation/Makefile b/Documentation/Makefile
index afdecc1a7f..b81a6a2c72 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -8,6 +8,7 @@ ARTICLES += cvs-migration
ARTICLES += diffcore
ARTICLES += howto-index
ARTICLES += repository-layout
+ARTICLES += hooks
# with their own formatting rules.
SP_ARTICLES = glossary howto/revert-branch-rebase
diff --git a/Documentation/git-applymbox.txt b/Documentation/git-applymbox.txt
index 3d813ec4cf..f6d857cda4 100644
--- a/Documentation/git-applymbox.txt
+++ b/Documentation/git-applymbox.txt
@@ -64,6 +64,12 @@ OPTIONS
generated "Signed-off-by" line based on your committer
identity.
+
+SEE ALSO
+--------
+link:git-applypatch.html[git-applypatch].
+
+
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
diff --git a/Documentation/git-applypatch.txt b/Documentation/git-applypatch.txt
index 14ce53aade..b8946321d3 100644
--- a/Documentation/git-applypatch.txt
+++ b/Documentation/git-applypatch.txt
@@ -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
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
-------
diff --git a/Documentation/git-commit-script.txt b/Documentation/git-commit-script.txt
index cf6b5c3da2..faa1870e34 100644
--- a/Documentation/git-commit-script.txt
+++ b/Documentation/git-commit-script.txt
@@ -8,7 +8,7 @@ git-commit-script - Record your changes
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
-----------
@@ -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
message.
+This command can run `commit-msg`, `pre-commit`, and
+`post-commit` hooks. See link:hooks.html[hooks] for more
+information.
+
OPTIONS
-------
-a::
@@ -47,8 +51,14 @@ OPTIONS
has a SP character immediately followed by a TAB
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>...::
- Update specified paths in the index file.
+ Update specified paths in the index file before committing.
Author
diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt
index d05827f611..9c5ef8e7a4 100644
--- a/Documentation/git-ls-files.txt
+++ b/Documentation/git-ls-files.txt
@@ -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
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
-path. (see read-cache for more information on state)
+path. (see git-read-tree for more information on state)
Exclude Patterns
@@ -180,7 +180,7 @@ An example:
See Also
--------
-link:read-cache.html[read-cache]
+link:git-read-tree.html[git-read-tree]
Author
diff --git a/Documentation/git-receive-pack.txt b/Documentation/git-receive-pack.txt
index 2f1a1f8ebb..2c6065fcb1 100644
--- a/Documentation/git-receive-pack.txt
+++ b/Documentation/git-receive-pack.txt
@@ -77,6 +77,12 @@ OPTIONS
<directory>::
The repository to sync into.
+
+SEE ALSO
+--------
+link:git-send-pack.html[git-send-pack]
+
+
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
diff --git a/Documentation/git-update-server-info.txt b/Documentation/git-update-server-info.txt
index 830f398034..74c4364ad8 100644
--- a/Documentation/git-update-server-info.txt
+++ b/Documentation/git-update-server-info.txt
@@ -24,8 +24,27 @@ OPTIONS
-------
--force::
- Update the info files even when they do not appear
- stale.
+ Update the info files from scratch.
+
+
+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
diff --git a/Documentation/hooks.txt b/Documentation/hooks.txt
new file mode 100644
index 0000000000..45809ba13a
--- /dev/null
+++ b/Documentation/hooks.txt
@@ -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.
diff --git a/apply.c b/apply.c
index e87190ea38..964df2db10 100644
--- a/apply.c
+++ b/apply.c
@@ -672,9 +672,13 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
added++;
newlines--;
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 '\\':
- if (len < 12 || memcmp(line, "\\ No newline", 12))
+ if (len < 12 || memcmp(line, "\\ ", 2))
return -1;
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
* before seeing it.
*/
- if (12 < size && !memcmp(line, "\\ No newline", 12))
+ if (12 < size && !memcmp(line, "\\ ", 2))
offset += linelen(line, size);
patch->lines_added += added;
diff --git a/cache.h b/cache.h
index 0dcd2fe53b..f0c9b01aa3 100644
--- a/cache.h
+++ b/cache.h
@@ -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 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);
extern void prepare_packed_git(void);
diff --git a/git-archimport-script b/git-archimport-script
index 6ff5d7dce0..8f475fd66d 100755
--- a/git-archimport-script
+++ b/git-archimport-script
@@ -49,12 +49,12 @@ $SIG{'PIPE'}="IGNORE";
$ENV{'TZ'}="UTC";
our($opt_h,$opt_v, $opt_T,
- $opt_C,$opt_t, $opt_i);
+ $opt_C,$opt_t);
sub usage() {
print STDERR <<END;
Usage: ${\basename $0} # fetch/update GIT from Arch
- [ -h ] [ -v ] [ -i ] [ -T ]
+ [ -h ] [ -v ] [ -T ]
[ -C GIT_repository ] [ -t tempdir ]
repository/arch-branch [ repository/arch-branch] ...
END
@@ -173,21 +173,19 @@ foreach my $root (@arch_roots) {
## TODO cleanup irrelevant patches
## and put an initial import
## or a full tag
-
-if ($opt_i) { # initial import
+my $import = 0;
+unless (-d '.git') { # initial import
if ($psets[0]{type} eq 'i' || $psets[0]{type} eq 't') {
print "Starting import from $psets[0]{id}\n";
+ `git-init-db`;
+ die $! if $?;
+ $import = 1;
} else {
die "Need to start from an import or a tag -- cannot use $psets[0]{id}";
}
- `git-init-db`;
- die $! if $?;
}
-# process
-my $lastbranch = branchname($psets[0]{id}); # only good for initial import
-my $importseen = $opt_i ? 0 : 1; # start at 1 if opt_i
-
+# process patchsets
foreach my $ps (@psets) {
$ps->{branch} = branchname($ps->{id});
@@ -201,14 +199,22 @@ foreach my $ps (@psets) {
}
die $! if $?;
+ #
+ # skip commits already in repo
+ #
+ if (ptag($ps->{id})) {
+ $opt_v && print "Skipping already imported: $ps->{id}\n";
+ next;
+ }
+
#
# create the branch if needed
#
- if ($ps->{type} eq 'i' && $importseen) {
- die "Should not have more than one 'Initial import' per GIT import";
+ if ($ps->{type} eq 'i' && !$import) {
+ die "Should not have more than one 'Initial import' per GIT import: $ps->{id}";
}
- unless ($opt_i && !$importseen) { # skip for first commit
+ unless ($import) { # skip for import
if ( -e ".git/refs/heads/$ps->{branch}") {
# we know about this branch
`git checkout $ps->{branch}`;
@@ -221,17 +227,24 @@ foreach my $ps (@psets) {
# find where we are supposed to branch from
`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 $?;
}
-
#
# Apply the import/changeset/merge into the working tree
#
if ($ps->{type} eq 'i' || $ps->{type} eq 't') {
- $importseen = 1;
apply_import($ps) or die $!;
+ $import=0;
} elsif ($ps->{type} eq 's') {
apply_cset($ps);
}
@@ -577,8 +590,6 @@ sub ptag {
} else { # read
# if the tag isn't there, return 0
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;
}
open(C,"<.git/archimport/tags/$tag")
diff --git a/local-pull.c b/local-pull.c
index 8b16f50e33..ca0003ba2a 100644
--- a/local-pull.c
+++ b/local-pull.c
@@ -17,7 +17,7 @@ void prefetch(unsigned char *sha1)
static struct packed_git *packs = NULL;
-void setup_index(unsigned char *sha1)
+static void setup_index(unsigned char *sha1)
{
struct packed_git *new_pack;
char filename[PATH_MAX];
@@ -30,7 +30,7 @@ void setup_index(unsigned char *sha1)
packs = new_pack;
}
-int setup_indices()
+static int setup_indices(void)
{
DIR *dir;
struct dirent *de;
@@ -49,7 +49,7 @@ int setup_indices()
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 (!link(source, dest)) {
@@ -97,7 +97,7 @@ int copy_file(const char *source, const char *dest, const char *hex)
return -1;
}
-int fetch_pack(unsigned char *sha1)
+static int fetch_pack(const unsigned char *sha1)
{
struct packed_git *target;
char filename[PATH_MAX];
@@ -125,7 +125,7 @@ int fetch_pack(unsigned char *sha1)
return 0;
}
-int fetch_file(unsigned char *sha1)
+static int fetch_file(const unsigned char *sha1)
{
static int object_name_start = -1;
static char filename[PATH_MAX];
diff --git a/patch-delta.c b/patch-delta.c
index 26281ea123..98c27beb25 100644
--- a/patch-delta.c
+++ b/patch-delta.c
@@ -34,9 +34,10 @@ void *patch_delta(void *src_buf, unsigned long src_size,
/* now the result size */
size = get_delta_hdr_size(&data);
- dst_buf = malloc(size);
+ dst_buf = malloc(size + 1);
if (!dst_buf)
return NULL;
+ dst_buf[size] = 0;
out = dst_buf;
while (data < top) {
diff --git a/sha1_file.c b/sha1_file.c
index fa37f1e3ef..64eac592bb 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -487,7 +487,7 @@ struct packed_git *parse_pack_index(unsigned char *sha1)
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;
unsigned long idx_size;
diff --git a/t/t4112-apply-renames.sh b/t/t4112-apply-renames.sh
new file mode 100755
index 0000000000..906188cdf6
--- /dev/null
+++ b/t/t4112-apply-renames.sh
@@ -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
diff --git a/tools/git-applymbox b/tools/git-applymbox
index 2b32dab5f5..e58bb21467 100755
--- a/tools/git-applymbox
+++ b/tools/git-applymbox
@@ -68,7 +68,8 @@ do
i="$1"
case "$resume,$continue" in
f,$i) resume=t;;
- f,*) continue;;
+ f,*) shift
+ continue;;
*)
git-mailinfo $keep_subject $utf8 \
.dotest/msg .dotest/patch <$i >.dotest/info || exit 1