Merge branch 'fixes'
authorJunio C Hamano <junkio@cox.net>
Wed, 5 Oct 2005 23:57:23 +0000 (16:57 -0700)
committerJunio C Hamano <junkio@cox.net>
Wed, 5 Oct 2005 23:57:23 +0000 (16:57 -0700)
25 files changed:
Documentation/asciidoc.conf
Documentation/cvs-migration.txt
Documentation/diff-format.txt
Documentation/diff-options.txt
Documentation/diffcore.txt
Documentation/git-add.txt
Documentation/git-apply.txt
Documentation/git-applymbox.txt
Documentation/git-archimport.txt
Documentation/git-bisect.txt
Documentation/git-branch.txt
Documentation/git-cat-file.txt
Documentation/git-cherry-pick.txt
Documentation/git-clone-pack.txt
Documentation/git-commit-tree.txt
Documentation/git-rev-parse.txt
clone-pack.c
diff.h
git-commit.sh
git-fetch.sh
index.c
refs.c
rev-list.c
rev-parse.c
upload-pack.c

index baefb2f..fa0877d 100644 (file)
@@ -7,6 +7,9 @@
 # Show GIT link as: <command>(<section>); if section is defined, else just show
 # the command.
 
+[attributes]
+caret=^
+
 ifdef::backend-docbook[]
 [gitlink-inlinemacro]
 {0%{target}}
@@ -19,3 +22,5 @@ ifdef::backend-xhtml11[]
 [gitlink-inlinemacro]
 <a href="{target}.html">{target}{0?({0})}</a>
 endif::backend-xhtml11[]
+
+
index 7c4dbef..4361278 100644 (file)
@@ -24,7 +24,7 @@ The good news is that most people don't do that, and in fact most sane
 people think it's a bug in CVS that makes it tag (and check in changes)
 one file at a time.  So most projects you'll ever see will use CVS
 'as if' it was sane.  In which case you'll find it very easy indeed to
-move over to Git. 
+move over to git. 
 
 First off: this is not a git tutorial. See
 link:tutorial.html[Documentation/tutorial.txt] for how git
@@ -229,7 +229,7 @@ does rename or copy would not show in the output, and if the
 "o-file.c", it would find the commit that changed the statement
 when it was in "o-file.c".
 
-NOTE: The current versions of "git-diff-tree -C" is not eager
+NOTE: The current version of "git-diff-tree -C" is not eager
   enough to find copies, and it will miss the fact that a-file.c
   was created by copying o-file.c unless o-file.c was somehow
   changed in the same commit.
index 6e9fa8c..dacd8fb 100644 (file)
@@ -1,8 +1,8 @@
 The output format from "git-diff-index", "git-diff-tree" and
 "git-diff-files" are very similar.
 
-These commands all compare two sets of things; what are
-compared are different:
+These commands all compare two sets of things; what is 
+compared differs:
 
 git-diff-index <tree-ish>::
         compares the <tree-ish> and the files on the filesystem.
@@ -46,7 +46,7 @@ That is, from the left to the right:
 . path for "dst"; only exists for C or R.
 . an LF or a NUL when '-z' option is used, to terminate the record.
 
-<sha1> is shown as all 0's if new is a file on the filesystem
+<sha1> is shown as all 0's if a file is new on the filesystem
 and it is out of sync with the cache.
 
 Example:
@@ -91,7 +91,7 @@ For a path that is added, removed, or modified,
 where:
 
      <old|new>-file:: are files GIT_EXTERNAL_DIFF can use to read the
-                     contents of <old|ne>,
+                     contents of <old|new>,
      <old|new>-hex:: are the 40-hexdigit SHA1 hashes,
      <old|new>-mode:: are the octal representation of the file modes.
 
@@ -121,12 +121,11 @@ The `a/` and `b/` filenames are the same unless rename/copy is
 involved.  Especially, even for a creation or a deletion,
 `/dev/null` is _not_ used in place of `a/` or `b/` filenames.
 +
-When rename/copy is involved, `file1` and `file2` shows the
+When rename/copy is involved, `file1` and `file2` show the
 name of the source file of the rename/copy and the name of
 the file that rename/copy produces, respectively.
 
-2.   It is followed by extended header lines that are one or
-     more of:
+2.   It is followed by one or more extended header lines:
 
        old mode <mode>
        new mode <mode>
index 613a60d..06500d0 100644 (file)
@@ -5,9 +5,8 @@
        Synonym for "-p".
 
 -r::
-       Look recursively in subdirectories; this flag does not
-       mean anything to commands other than "git-diff-tree";
-       other diff commands always look at all the subdirectories.
+       Look recursively in subdirectories; only used by "git-diff-tree";
+       other diff commands always work recursively.
 
 -z::
        \0 line termination on output
        Detect copies as well as renames.
 
 --find-copies-harder::
-       By default, -C option finds copies only if the original
-       file of the copy was modified in the same changeset for
-       performance reasons.  This flag makes the command
+       For performance reasons, by default, -C option finds copies only 
+       if the original file of the copy was modified in the same 
+       changeset.  This flag makes the command
        inspect unmodified files as candidates for the source of
        copy.  This is a very expensive operation for large
        projects, so use it with caution.
 
 -l<num>::
        -M and -C options require O(n^2) processing time where n
-       in the number of potential rename/copy targets.  This
+       is the number of potential rename/copy targets.  This
        option prevents rename/copy detection from running if
-       the number of rename/copy targets exceed the specified
+       the number of rename/copy targets exceeds the specified
        number.
 
 -S<string>::
-       Look for differences that contains the change in <string>.
+       Look for differences that contain the change in <string>.
 
 --pickaxe-all::
        When -S finds a change, show all the changes in that
-       changeset, not just the files that contains the change
+       changeset, not just the files that contain the change
        in <string>.
 
 -O<orderfile>::
index a1f03df..9d20a4f 100644 (file)
@@ -177,7 +177,7 @@ diffcore-merge-broken
 ---------------------
 
 This transformation is used to merge filepairs broken by
-diffcore-break, and were not transformed into rename/copy by
+diffcore-break, and not transformed into rename/copy by
 diffcore-rename, back into a single modification.  This always
 runs when diffcore-break is used.
 
@@ -206,10 +206,10 @@ like these:
 * -B/60 (the same as above, since diffcore-break defaults to 50%).
 
 Note that earlier implementation left a broken pair as a separate
-creation and deletion patches.  This was unnecessary hack and
+creation and deletion patches.  This was an unnecessary hack and
 the latest implementation always merges all the broken pairs
 back into modifications, but the resulting patch output is
-formatted differently to still let the reviewing easier for such
+formatted differently for easier review in case of such
 a complete rewrite by showing the entire contents of old version
 prefixed with '-', followed by the entire contents of new
 version prefixed with '+'.
index ae1ea76..4a03b4c 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 
 DESCRIPTION
 -----------
-A simple wrapper to git-update-index to add files to the cache for people used
+A simple wrapper for git-update-index to add files to the cache for people used
 to do "cvs add".
 
 OPTIONS
index cb67634..e095f93 100644 (file)
@@ -13,7 +13,7 @@ SYNOPSIS
 
 DESCRIPTION
 -----------
-Reads supplied diff output and applies it on a GIT index file
+Reads supplied diff output and applies it on a git index file
 and a work tree.
 
 OPTIONS
index 5022643..bb54378 100644 (file)
@@ -22,7 +22,7 @@ OPTIONS
 -q::
        Apply patches interactively.  The user will be given
        opportunity to edit the log message and the patch before
-       attempting to apply patch in each e-mail message.
+       attempting to apply it.
 
 -k::
        Usually the program 'cleans up' the Subject: header line
index 6054731..b6793cf 100644 (file)
@@ -20,20 +20,23 @@ it will just import it as a regular commit. If it can find it, it will mark it
 as a merge whenever possible (see discussion below). 
 
 The script expects you to provide the key roots where it can start the import 
-from an 'initial import' or 'tag' type of Arch commit. It will follow and import 
-new branches within the provided roots. 
+from an 'initial import' or 'tag' type of Arch commit. It will follow and 
+import new branches within the provided roots. 
 
 It expects to be dealing with one project only. If it sees 
-branches that have different roots, it will refuse to run. In that case, edit your
-<archive/branch> parameters to define clearly the scope of the import. 
+branches that have different roots, it will refuse to run. In that case, 
+edit your <archive/branch> parameters to define clearly the scope of the 
+import. 
 
-`git-archimport` uses `tla` extensively in the background to access the Arch repository.
+`git-archimport` uses `tla` extensively in the background to access the 
+Arch repository.
 Make sure you have a recent version of `tla` available in the path. `tla` must
 know about the repositories you pass to `git-archimport`. 
 
 For the initial import `git-archimport` expects to find itself in an empty 
 directory. To follow the development of a project that uses Arch, rerun 
-`git-archimport` with the same parameters as the initial import to perform incremental imports.
+`git-archimport` with the same parameters as the initial import to perform 
+incremental imports.
 
 MERGES
 ------
index ede06da..39fa665 100644 (file)
@@ -76,7 +76,7 @@ During the bisection process, you can say
 
 to see the currently remaining suspects in `gitk`.
 
-The good/bad you told the command is logged, and `git bisect
+The good/bad input is logged, and `git bisect
 log` shows what you have done so far.  You can truncate its
 output somewhere and save it in a file, and run
 
index a2a0cfb..a7121a4 100644 (file)
@@ -23,7 +23,7 @@ OPTIONS
        The name of the branch to create.
 
 start-point::
-       Where to make the branch; defaults to HEAD.
+       Where to create the branch; defaults to HEAD.
 
 Author
 ------
index 44983b6..f21a6e0 100644 (file)
@@ -32,7 +32,7 @@ OPTIONS
 
 <type>::
        Typically this matches the real type of <object> but asking
-       for a type that can trivially dereferenced from the given
+       for a type that can trivially be dereferenced from the given
        <object> is also permitted.  An example is to ask for a
        "tree" with <object> being a commit object that contains it,
        or to ask for a "blob" with <object> being a tag object that
index cd5b97d..8462e06 100644 (file)
@@ -22,7 +22,7 @@ OPTIONS
        Commit to cherry-pick.
 
 -r::
-       Usuall the command appends which commit was
+       Usually the command appends which commit was
        cherry-picked after the original commit message when
        making a commit.  This option, '--replay', causes it to
        use the original commit message intact.  This is useful
index 83d17a0..a7868e5 100644 (file)
@@ -26,8 +26,8 @@ OPTIONS
 
 --exec=<git-upload-pack>::
        Use this to specify the path to 'git-upload-pack' on the
-       remote side, if is not found on your $PATH.
-       Installations of sshd ignores the user's environment
+       remote side, if it is not found on your $PATH.
+       Installations of sshd ignore the user's environment
        setup scripts for login shells (e.g. .bash_profile) and
        your privately installed GIT may not be found on the system
        default $PATH.  Another workaround suggested is to set
index 895f733..9aba868 100644 (file)
@@ -36,7 +36,7 @@ OPTIONS
        An existing tree object
 
 -p <parent commit>::
-       Each '-p' indicates the id of a parent commit object.
+       Each '-p' indicates the id of a parent commit object.
        
 
 Commit Information
index e2d94ff..99fd90e 100644 (file)
@@ -54,13 +54,13 @@ OPTIONS
        `git-diff-\*`).
 
 --not::
-       When showing object names, prefix them with '^' and
-       strip '^' prefix from the object names that already have
+       When showing object names, prefix them with '{caret}' and
+       strip '{caret}' prefix from the object names that already have
        one.
 
 --symbolic::
        Usually the object names are output in SHA1 form (with
-       possible '^' prefix); this option makes them output in a
+       possible '{caret}' prefix); this option makes them output in a
        form as close to the original input as possible.
 
 
@@ -93,22 +93,23 @@ what is called an 'extended SHA1' syntax.
   happen to have both heads/master and tags/master, you can
   explicitly say 'heads/master' to tell GIT which one you mean.
 
-* A suffix '^' to a revision parameter means the first parent of
-  that commit object.  '^<n>' means the <n>th parent (i.e.
-  'rev^'
-  is equivalent to 'rev^1').  As a special rule,
-  'rev^0' means the commit itself and is used when 'rev' is the
+* A suffix '{caret}' to a revision parameter means the first parent of
+  that commit object.  '{caret}<n>' means the <n>th parent (i.e.
+  'rev{caret}'
+  is equivalent to 'rev{caret}1').  As a special rule,
+  'rev{caret}0' means the commit itself and is used when 'rev' is the
   object name of a tag object that refers to a commit object.
 
 * A suffix '~<n>' to a revision parameter means the commit
   object that is the <n>th generation grand-parent of the named
   commit object, following only the first parent.  I.e. rev~3 is
-  equivalent to rev^^^ which is equivalent to rev^1^1^1.
+  equivalent to rev{caret}{caret}{caret} which is equivalent to\
+  rev{caret}1{caret}1{caret}1.
 
-'git-rev-parse' also accepts a prefix '^' to revision parameter,
+'git-rev-parse' also accepts a prefix '{caret}' to revision parameter,
 which is passed to 'git-rev-list'.  Two revision parameters
 concatenated with '..' is a short-hand for writing a range
-between them.  I.e. 'r1..r2' is equivalent to saying '^r1 r2'
+between them.  I.e. 'r1..r2' is equivalent to saying '{caret}r1 r2'
 
 
 Author
index 49820c6..c102ca8 100644 (file)
@@ -51,6 +51,7 @@ static void write_refs(struct ref *ref)
        struct ref *head = NULL, *head_ptr, *master_ref;
        char *head_path;
 
+       /* Upload-pack must report HEAD first */
        if (!strcmp(ref->name, "HEAD")) {
                head = ref;
                ref = ref->next;
@@ -60,17 +61,21 @@ static void write_refs(struct ref *ref)
        while (ref) {
                if (is_master(ref))
                        master_ref = ref;
-               if (head && !memcmp(ref->old_sha1, head->old_sha1, 20)) {
-                       if (!head_ptr || ref == master_ref)
-                               head_ptr = ref;
-               }
+               if (head &&
+                   !memcmp(ref->old_sha1, head->old_sha1, 20) &&
+                   !strncmp(ref->name, "refs/heads/",11) &&
+                   (!head_ptr || ref == master_ref))
+                       head_ptr = ref;
+
                write_one_ref(ref);
                ref = ref->next;
        }
-       if (!head)
+       if (!head) {
+               fprintf(stderr, "No HEAD in remote.\n");
                return;
+       }
 
-       head_path = git_path("HEAD");
+       head_path = strdup(git_path("HEAD"));
        if (!head_ptr) {
                /*
                 * If we had a master ref, and it wasn't HEAD, we need to undo the
@@ -82,6 +87,7 @@ static void write_refs(struct ref *ref)
                        unlink(head_path);
                }
                write_one_ref(head);
+               free(head_path);
                return;
        }
 
@@ -89,13 +95,15 @@ static void write_refs(struct ref *ref)
        if (master_ref)
                return;
 
+       fprintf(stderr, "Setting HEAD to %s\n", head_ptr->name);
+
        /*
         * Uhhuh. Other end didn't have master. We start HEAD off with
         * the first branch with the same value.
         */
-       unlink(head_path);
-       if (symlink(head_ptr->name, head_path) < 0)
+       if (create_symref(head_path, head_ptr->name) < 0)
                die("unable to link HEAD to %s", head_ptr->name);
+       free(head_path);
 }
 
 static int clone_pack(int fd[2], int nr_match, char **match)
diff --git a/diff.h b/diff.h
index 7f4079c..2f4a7b4 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -103,7 +103,7 @@ extern void diff_flush(struct diff_options*);
 /* these are not diff-raw status letters proper, but used by
  * diffcore-filter insn to specify additional restrictions.
  */
-#define DIFF_STATUS_FILTER_AON         'A'
+#define DIFF_STATUS_FILTER_AON         '*'
 #define DIFF_STATUS_FILTER_BROKEN      'B'
 
 #endif /* DIFF_H */
index 5e85b54..591fcdc 100755 (executable)
@@ -198,7 +198,7 @@ else
        PARENTS=""
 fi
 git-status >>.editmsg
-if [ "$?" != "0" -a ! -f $GIT_DIR/MERGE_HEAD ]
+if [ "$?" != "0" -a ! -f "$GIT_DIR/MERGE_HEAD" ]
 then
        rm -f .editmsg
        git-status
index 61da6a9..d398866 100755 (executable)
@@ -49,7 +49,7 @@ rsync_slurped_objects=
 
 if test "" = "$append"
 then
-       : >$GIT_DIR/FETCH_HEAD
+       : >"$GIT_DIR/FETCH_HEAD"
 fi
 
 append_fetch_head () {
@@ -86,11 +86,11 @@ append_fetch_head () {
     if git-cat-file commit "$head_" >/dev/null 2>&1
     then
        headc_=$(git-rev-parse --verify "$head_^0") || exit
-       echo "$headc_   $not_for_merge_ $note_" >>$GIT_DIR/FETCH_HEAD
+       echo "$headc_   $not_for_merge_ $note_" >>"$GIT_DIR/FETCH_HEAD"
        echo >&2 "* committish: $head_"
        echo >&2 "  $note_"
     else
-       echo "$head_    not-for-merge   $note_" >>$GIT_DIR/FETCH_HEAD
+       echo "$head_    not-for-merge   $note_" >>"$GIT_DIR/FETCH_HEAD"
        echo >&2 "* non-commit: $head_"
        echo >&2 "  $note_"
     fi
diff --git a/index.c b/index.c
index bdde65f..ad0eafe 100644 (file)
--- a/index.c
+++ b/index.c
@@ -22,14 +22,16 @@ static void remove_lock_file_on_signal(int signo)
 
 int hold_index_file_for_update(struct cache_file *cf, const char *path)
 {
+       int fd;
        sprintf(cf->lockfile, "%s.lock", path);
-       cf->next = cache_file_list;
-       cache_file_list = cf;
-       if (!cf->next) {
+       fd = open(cf->lockfile, O_RDWR | O_CREAT | O_EXCL, 0666);
+       if (fd >=0 && !cf->next) {
+               cf->next = cache_file_list;
+               cache_file_list = cf;
                signal(SIGINT, remove_lock_file_on_signal);
                atexit(remove_lock_file);
        }
-       return open(cf->lockfile, O_RDWR | O_CREAT | O_EXCL, 0666);
+       return fd;
 }
 
 int commit_index_file(struct cache_file *cf)
diff --git a/refs.c b/refs.c
index 2aac90c..5a8cbd4 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -46,7 +46,7 @@ int validate_symref(const char *path)
        len -= 4;
        while (len && isspace(*buf))
                buf++, len--;
-       if (len >= 5 && !memcmp("refs/", buffer, 5))
+       if (len >= 5 && !memcmp("refs/", buf, 5))
                return 0;
        return -1;
 }
index 5ec9ccb..c60aa72 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "refs.h"
 #include "tag.h"
 #include "commit.h"
 #include "tree.h"
@@ -489,6 +490,22 @@ static void handle_one_commit(struct commit *com, struct commit_list **lst)
        commit_list_insert(com, lst);
 }
 
+/* for_each_ref() callback does not allow user data -- Yuck. */
+static struct commit_list **global_lst;
+
+static int include_one_commit(const char *path, const unsigned char *sha1)
+{
+       struct commit *com = get_commit_reference(path, 0);
+       handle_one_commit(com, global_lst);
+       return 0;
+}
+
+static void handle_all(struct commit_list **lst)
+{
+       global_lst = lst;
+       for_each_ref(include_one_commit);
+       global_lst = NULL;
+}
 
 int main(int argc, char **argv)
 {
@@ -542,6 +559,10 @@ int main(int argc, char **argv)
                        bisect_list = 1;
                        continue;
                }
+               if (!strcmp(arg, "--all")) {
+                       handle_all(&list);
+                       continue;
+               }
                if (!strcmp(arg, "--objects")) {
                        tag_objects = 1;
                        tree_objects = 1;
index 507b531..41b9dae 100644 (file)
@@ -32,6 +32,7 @@ static int revs_count = 0;
 static int is_rev_argument(const char *arg)
 {
        static const char *rev_args[] = {
+               "--all",
                "--bisect",
                "--header",
                "--max-age=",
index da10742..83f5a35 100644 (file)
@@ -30,10 +30,18 @@ static void create_pack_file(void)
 
        if (!pid) {
                int i;
-               int args = nr_has + nr_needs + 5;
-               char **argv = xmalloc(args * sizeof(char *));
-               char *buf = xmalloc(args * 45);
-               char **p = argv;
+               int args;
+               char **argv;
+               char *buf;
+               char **p;
+
+               if (MAX_NEEDS <= nr_needs)
+                       args = nr_has + 10;
+               else
+                       args = nr_has + nr_needs + 5;
+               argv = xmalloc(args * sizeof(char *));
+               buf = xmalloc(args * 45);
+               p = argv;
 
                dup2(fd[1], 1);
                close(0);
@@ -41,10 +49,14 @@ static void create_pack_file(void)
                close(fd[1]);
                *p++ = "git-rev-list";
                *p++ = "--objects";
-               for (i = 0; i < nr_needs; i++) {
-                       *p++ = buf;
-                       memcpy(buf, sha1_to_hex(needs_sha1[i]), 41);
-                       buf += 41;
+               if (MAX_NEEDS <= nr_needs)
+                       *p++ = "--all";
+               else {
+                       for (i = 0; i < nr_needs; i++) {
+                               *p++ = buf;
+                               memcpy(buf, sha1_to_hex(needs_sha1[i]), 41);
+                               buf += 41;
+                       }
                }
                for (i = 0; i < nr_has; i++) {
                        *p++ = buf;
@@ -129,18 +141,24 @@ static int receive_needs(void)
 
        needs = 0;
        for (;;) {
+               unsigned char dummy[20], *sha1_buf;
                len = packet_read_line(0, line, sizeof(line));
                if (!len)
                        return needs;
 
-               /*
-                * This is purely theoretical right now: git-fetch-pack only
-                * ever asks for a single HEAD
-                */
-               if (needs >= MAX_NEEDS)
-                       die("I'm only doing a max of %d requests", MAX_NEEDS);
-               if (strncmp("want ", line, 5) || get_sha1_hex(line+5, needs_sha1[needs]))
-                       die("git-upload-pack: protocol error, expected to get sha, not '%s'", line);
+               sha1_buf = dummy;
+               if (needs == MAX_NEEDS) {
+                       fprintf(stderr,
+                               "warning: supporting only a max of %d requests. "
+                               "sending everything instead.\n",
+                               MAX_NEEDS);
+               }
+               else if (needs < MAX_NEEDS)
+                       sha1_buf = needs_sha1[needs];
+
+               if (strncmp("want ", line, 5) || get_sha1_hex(line+5, sha1_buf))
+                       die("git-upload-pack: protocol error, "
+                           "expected to get sha, not '%s'", line);
                needs++;
        }
 }