Merge branch 'master' of .
authorJunio C Hamano <junkio@cox.net>
Sun, 4 Sep 2005 22:47:28 +0000 (15:47 -0700)
committerJunio C Hamano <junkio@cox.net>
Sun, 4 Sep 2005 22:47:28 +0000 (15:47 -0700)
16 files changed:
Documentation/Makefile
Documentation/git-applymbox.txt
Documentation/git-applypatch.txt
Documentation/git-commit-script.txt
Documentation/git-ls-files.txt
Documentation/git-receive-pack.txt
Documentation/git-update-server-info.txt
Documentation/hooks.txt [new file with mode: 0644]
apply.c
cache.h
git-archimport-script
local-pull.c
patch-delta.c
sha1_file.c
t/t4112-apply-renames.sh [new file with mode: 0755]
tools/git-applymbox

index afdecc1..b81a6a2 100644 (file)
@@ -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
 
index 3d813ec..f6d857c 100644 (file)
@@ -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>
index 14ce53a..b894632 100644 (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
 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
 -------
index cf6b5c3..faa1870 100644 (file)
@@ -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
index d05827f..9c5ef8e 100644 (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
 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
index 2f1a1f8..2c6065f 100644 (file)
@@ -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>
index 830f398..74c4364 100644 (file)
@@ -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 (file)
index 0000000..45809ba
--- /dev/null
@@ -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 e87190e..964df2d 100644 (file)
--- 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 0dcd2fe..f0c9b01 100644 (file)
--- 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);
index 6ff5d7d..8f475fd 100755 (executable)
@@ -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")
index 8b16f50..ca0003b 100644 (file)
@@ -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];
index 26281ea..98c27be 100644 (file)
@@ -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) {
index fa37f1e..64eac59 100644 (file)
@@ -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 (executable)
index 0000000..906188c
--- /dev/null
@@ -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
index 2b32dab..e58bb21 100755 (executable)
@@ -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