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 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 , , and 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) | -F | -m ] ... +'git commit' [-a] [-s] [-v] [(-c | -C) | -F | -m ] [-e] ... 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. + ...:: - 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 :: The repository to sync into. + +SEE ALSO +-------- +link:git-send-pack.html[git-send-pack] + + Author ------ Written by Linus Torvalds 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 <{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