Merge branch 'js/attach'
authorJunio C Hamano <junkio@cox.net>
Sun, 11 Mar 2007 07:38:18 +0000 (23:38 -0800)
committerJunio C Hamano <junkio@cox.net>
Sun, 11 Mar 2007 07:38:18 +0000 (23:38 -0800)
* js/attach:
format-patch --attach: not folding some long headers.
format-patch: add --inline option and make --attach a true attachment

162 files changed:
Documentation/RelNotes-1.5.1.txt
Documentation/SubmittingPatches
Documentation/git-archimport.txt
Documentation/git-commit.txt
Documentation/git-config.txt
Documentation/git-diff.txt
Documentation/git-fast-import.txt
Documentation/git-format-patch.txt
Documentation/git-receive-pack.txt
Documentation/git.txt
Documentation/install-webdoc.sh
Documentation/sort_glossary.pl
Documentation/user-manual.txt
Makefile
builtin-apply.c
builtin-blame.c
builtin-branch.c
builtin-bundle.c
builtin-config.c
builtin-count-objects.c
builtin-for-each-ref.c
builtin-fsck.c
builtin-grep.c
builtin-mailinfo.c
builtin-pack-objects.c
builtin-revert.c [new file with mode: 0644]
builtin-shortlog.c
builtin-show-branch.c
builtin.h
cache.h
combine-diff.c
commit.c
config.c
contrib/emacs/Makefile
contrib/emacs/git.el
convert-objects.c
diff-lib.c
diff.c
diffcore-break.c
diffcore-order.c
diffcore-rename.c
dir.c
environment.c
fast-import.c
git-archimport.perl
git-commit.sh
git-compat-util.h
git-gui/Makefile
git-gui/git-gui.sh
git-revert.sh [deleted file]
git.c
gitweb/gitweb.perl
index-pack.c
interpolate.c
interpolate.h
pack-check.c
pack-redundant.c
path.c
perl/Makefile
read-cache.c
receive-pack.c
refs.c
setup.c
sha1_file.c
sha1_name.c
t/annotate-tests.sh
t/diff-lib.sh
t/t1000-read-tree-m-3way.sh
t/t1001-read-tree-m-2way.sh
t/t1002-read-tree-m-u-2way.sh
t/t1300-repo-config.sh
t/t3001-ls-files-others-exclude.sh
t/t3002-ls-files-dashpath.sh
t/t3100-ls-tree-restrict.sh
t/t3101-ls-tree-dirname.sh
t/t3300-funny-names.sh
t/t3900-i18n-commit.sh
t/t4006-diff-mode.sh
t/t4013-diff-various.sh
t/t4015-diff-whitespace.sh
t/t4016-diff-quote.sh
t/t4100-apply-stat.sh
t/t4104-apply-boundary.sh
t/t4115-apply-symlink.sh
t/t4116-apply-reverse.sh
t/t4117-apply-reject.sh
t/t4118-apply-empty-context.sh
t/t4200-rerere.sh
t/t5400-send-pack.sh
t/t5401-update-hooks.sh
t/t5515-fetch-merge-logic.sh [new file with mode: 0755]
t/t5515/fetch.br-branches-default [new file with mode: 0644]
t/t5515/fetch.br-branches-default-merge [new file with mode: 0644]
t/t5515/fetch.br-branches-default-merge_branches-default [new file with mode: 0644]
t/t5515/fetch.br-branches-default-octopus [new file with mode: 0644]
t/t5515/fetch.br-branches-default-octopus_branches-default [new file with mode: 0644]
t/t5515/fetch.br-branches-default_branches-default [new file with mode: 0644]
t/t5515/fetch.br-branches-one [new file with mode: 0644]
t/t5515/fetch.br-branches-one-merge [new file with mode: 0644]
t/t5515/fetch.br-branches-one-merge_branches-one [new file with mode: 0644]
t/t5515/fetch.br-branches-one-octopus [new file with mode: 0644]
t/t5515/fetch.br-branches-one-octopus_branches-one [new file with mode: 0644]
t/t5515/fetch.br-branches-one_branches-one [new file with mode: 0644]
t/t5515/fetch.br-config-explicit [new file with mode: 0644]
t/t5515/fetch.br-config-explicit-merge [new file with mode: 0644]
t/t5515/fetch.br-config-explicit-merge_config-explicit [new file with mode: 0644]
t/t5515/fetch.br-config-explicit-octopus [new file with mode: 0644]
t/t5515/fetch.br-config-explicit-octopus_config-explicit [new file with mode: 0644]
t/t5515/fetch.br-config-explicit_config-explicit [new file with mode: 0644]
t/t5515/fetch.br-config-glob [new file with mode: 0644]
t/t5515/fetch.br-config-glob-merge [new file with mode: 0644]
t/t5515/fetch.br-config-glob-merge_config-glob [new file with mode: 0644]
t/t5515/fetch.br-config-glob-octopus [new file with mode: 0644]
t/t5515/fetch.br-config-glob-octopus_config-glob [new file with mode: 0644]
t/t5515/fetch.br-config-glob_config-glob [new file with mode: 0644]
t/t5515/fetch.br-remote-explicit [new file with mode: 0644]
t/t5515/fetch.br-remote-explicit-merge [new file with mode: 0644]
t/t5515/fetch.br-remote-explicit-merge_remote-explicit [new file with mode: 0644]
t/t5515/fetch.br-remote-explicit-octopus [new file with mode: 0644]
t/t5515/fetch.br-remote-explicit-octopus_remote-explicit [new file with mode: 0644]
t/t5515/fetch.br-remote-explicit_remote-explicit [new file with mode: 0644]
t/t5515/fetch.br-remote-glob [new file with mode: 0644]
t/t5515/fetch.br-remote-glob-merge [new file with mode: 0644]
t/t5515/fetch.br-remote-glob-merge_remote-glob [new file with mode: 0644]
t/t5515/fetch.br-remote-glob-octopus [new file with mode: 0644]
t/t5515/fetch.br-remote-glob-octopus_remote-glob [new file with mode: 0644]
t/t5515/fetch.br-remote-glob_remote-glob [new file with mode: 0644]
t/t5515/fetch.br-unconfig [new file with mode: 0644]
t/t5515/fetch.br-unconfig_--tags_.._.git [new file with mode: 0644]
t/t5515/fetch.br-unconfig_.._.git [new file with mode: 0644]
t/t5515/fetch.br-unconfig_.._.git_one [new file with mode: 0644]
t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file [new file with mode: 0644]
t/t5515/fetch.br-unconfig_.._.git_one_two [new file with mode: 0644]
t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file [new file with mode: 0644]
t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three [new file with mode: 0644]
t/t5515/fetch.br-unconfig_branches-default [new file with mode: 0644]
t/t5515/fetch.br-unconfig_branches-one [new file with mode: 0644]
t/t5515/fetch.br-unconfig_config-explicit [new file with mode: 0644]
t/t5515/fetch.br-unconfig_config-glob [new file with mode: 0644]
t/t5515/fetch.br-unconfig_remote-explicit [new file with mode: 0644]
t/t5515/fetch.br-unconfig_remote-glob [new file with mode: 0644]
t/t5515/fetch.master [new file with mode: 0644]
t/t5515/fetch.master_--tags_.._.git [new file with mode: 0644]
t/t5515/fetch.master_.._.git [new file with mode: 0644]
t/t5515/fetch.master_.._.git_one [new file with mode: 0644]
t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file [new file with mode: 0644]
t/t5515/fetch.master_.._.git_one_two [new file with mode: 0644]
t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file [new file with mode: 0644]
t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three [new file with mode: 0644]
t/t5515/fetch.master_branches-default [new file with mode: 0644]
t/t5515/fetch.master_branches-one [new file with mode: 0644]
t/t5515/fetch.master_config-explicit [new file with mode: 0644]
t/t5515/fetch.master_config-glob [new file with mode: 0644]
t/t5515/fetch.master_remote-explicit [new file with mode: 0644]
t/t5515/fetch.master_remote-glob [new file with mode: 0644]
t/t6023-merge-file.sh
t/t6024-recursive-merge.sh
t/t6200-fmt-merge-msg.sh
t/t9100-git-svn-basic.sh
t/t9300-fast-import.sh
templates/Makefile
xdiff-interface.c
index aa371be1daeb75b0a9ce59fa6434ccfdb3f547bc..f374e1c2c75a597c15a9f0bbb2ff2fec6ec190df 100644 (file)
@@ -22,6 +22,9 @@ Updates since v1.5.0
   - "git diff --no-index pathA pathB" can be used as diff
     replacement with git specific enhancements.
 
+  - "git diff --pretty=format:<string>" to allow more flexible
+    custom log output.
+
   - "git name-rev" learned --refs=<pattern>, to limit the tags
     used for naming the given revisions only to the ones
     matching the given pattern.
@@ -36,6 +39,10 @@ Updates since v1.5.0
   - "git bundle" can help sneaker-netting your changes between
     repositories.
 
+  - A new configuration "core.symlinks" can be used to disable
+    symlinks on filesystems that do not support them; they are
+    checked out as regular files instead.
+
 
 * Updated behaviour of existing commands.
 
@@ -89,6 +96,9 @@ Updates since v1.5.0
 
   - "git status" in a read-only repository got a bit saner.
 
+  - "git fetch" (hence "git clone" and "git pull") are less
+    noisy when the output does not go to tty.
+
 * Hooks
 
   - The sample update hook to show how to send out notification
@@ -98,7 +108,7 @@ Updates since v1.5.0
 
 --
 exec >/var/tmp/1
-O=v1.5.0.2-259-g16d5315
+O=v1.5.0.3-268-g3ddad98
 echo O=`git describe master`
 git shortlog --no-merges $O..master ^maint
 
index 285781d9db8d337dadf5a59bbf46183d2f816fac..131bcff9b2367d63d7c8960487893bfcbfcfaa40 100644 (file)
@@ -1,3 +1,30 @@
+Checklist (and a short version for the impatient):
+
+       - make commits of logical units
+       - check for unnecessary whitespace with "git diff --check"
+         before committing
+       - do not check in commented out code or unneeded files
+       - provide a meaningful commit message
+       - the first line of the commit message should be a short
+         description and should skip the full stop
+       - if you want your work included in git.git, add a
+         "Signed-off-by: Your Name <your@email.com>" line to the
+         commit message (or just use the option "-s" when
+         committing) to confirm that you agree to the Developer's
+         Certificate of Origin
+       - do not PGP sign your patch
+       - use "git format-patch -M" to create the patch
+       - do not attach your patch, but read in the mail
+         body, unless you cannot teach your mailer to
+         leave the formatting of the patch alone.
+       - be careful doing cut & paste into your mailer, not to
+         corrupt whitespaces.
+       - provide additional information (which is unsuitable for
+         the commit message) between the "---" and the diffstat
+       - send the patch to the list _and_ the maintainer
+
+Long version:
+
 I started reading over the SubmittingPatches document for Linux
 kernel, primarily because I wanted to have a document similar to
 it for the core GIT to make sure people understand what they are
index 5a13187a87e55b90ab0be8c32a8116200f492bbc..82cb41d2791abbd32bd8209660e9879b9f2b8f32 100644 (file)
@@ -10,7 +10,7 @@ SYNOPSIS
 --------
 [verse]
 'git-archimport' [-h] [-v] [-o] [-a] [-f] [-T] [-D depth] [-t tempdir]
-               <archive/branch> [ <archive/branch> ]
+               <archive/branch>[:<git-branch>] ...
 
 DESCRIPTION
 -----------
@@ -39,6 +39,19 @@ 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.
 
+While git-archimport will try to create sensible branch names for the
+archives that it imports, it is also possible to specify git branch names
+manually.  To do so, write a git branch name after each <archive/branch>
+parameter, separated by a colon.  This way, you can shorten the Arch
+branch names and convert Arch jargon to git jargon, for example mapping a
+"PROJECT--devo--VERSION" branch to "master".
+
+Associating multiple Arch branches to one git branch is possible; the
+result will make the most sense only if no commits are made to the first
+branch, after the second branch is created.  Still, this is useful to
+convert Arch repositories that had been rotated periodically.
+
+
 MERGES
 ------
 Patch merge data from Arch is used to mark merges in git as well. git 
@@ -73,7 +86,9 @@ OPTIONS
        Use this for compatibility with old-style branch names used by
        earlier versions of git-archimport.  Old-style branch names
        were category--branch, whereas new-style branch names are
-       archive,category--branch--version.
+       archive,category--branch--version.  In both cases, names given
+       on the command-line will override the automatically-generated
+       ones.
 
 -D <depth>::
        Follow merge ancestry and attempt to import trees that have been
index 2187eee4164038346ed7a3ae32f563aeb74f23f7..53a7bb0895036e4d66086b8c656e74588c82c38c 100644 (file)
@@ -8,8 +8,9 @@ git-commit - Record changes to the repository
 SYNOPSIS
 --------
 [verse]
-'git-commit' [-a] [-s] [-v] [(-c | -C) <commit> | -F <file> | -m <msg> |
-           --amend] [--no-verify] [-e] [--author <author>]
+'git-commit' [-a | --interactive] [-s] [-v]
+          [(-c | -C) <commit> | -F <file> | -m <msg> | --amend]
+          [--no-verify] [-e] [--author <author>]
           [--] [[-i | -o ]<file>...]
 
 DESCRIPTION
@@ -35,6 +36,10 @@ methods:
    before, and to automatically "rm" files that have been
    removed from the working tree, and perform the actual commit.
 
+5. by using the --interactive switch with the 'commit' command to decide one
+   by one which files should be part of the commit, before finalizing the
+   operation.  Currently, this is done by invoking `git-add --interactive`.
+
 The gitlink:git-status[1] command can be used to obtain a
 summary of what is included by any of the above for the next
 commit by giving the same set of parameters you would give to
index 6624484fe1b0e50f8d32ad474da6455cf737e43a..68de5881bd36aabd1b4b13c2bce48a226c34788e 100644 (file)
@@ -16,6 +16,8 @@ SYNOPSIS
 'git-config' [--global] [type] --get-all name [value_regex]
 'git-config' [--global] [type] --unset name [value_regex]
 'git-config' [--global] [type] --unset-all name [value_regex]
+'git-config' [--global] [type] --rename-section old_name new_name
+'git-config' [--global] [type] --remove-section name
 'git-config' [--global] -l | --list
 
 DESCRIPTION
@@ -74,6 +76,12 @@ OPTIONS
 --global::
        Use global ~/.gitconfig file rather than the repository .git/config.
 
+--remove-section::
+       Remove the given section from the configuration file.
+
+--rename-section::
+       Rename the given section to a new name.
+
 --unset::
        Remove the line matching the key from config file.
 
index 12a531d1e9e4a7382f017ac303203e20abf47f2f..044cee9b425bedc7addd9a4418b553557902711b 100644 (file)
@@ -8,7 +8,7 @@ git-diff - Show changes between commits, commit and working tree, etc
 
 SYNOPSIS
 --------
-'git-diff' [ --diff-options ] <commit>{0,2} [--] [<path>...]
+'git-diff' [<common diff options>] <commit>{0,2} [--] [<path>...]
 
 DESCRIPTION
 -----------
index 77a14bb076b6d8be624345ee10e4bd14cfb2c359..eaba6fd4c168564f43ce2db3994dcb7b70bd4b54 100644 (file)
@@ -62,7 +62,18 @@ OPTIONS
        Dumps the internal marks table to <file> when complete.
        Marks are written one per line as `:markid SHA-1`.
        Frontends can use this file to validate imports after they
-       have been completed.
+       have been completed, or to save the marks table across
+       incremental runs.  As <file> is only opened and truncated
+       at checkpoint (or completion) the same path can also be
+       safely given to \--import-marks.
+
+--import-marks=<file>::
+       Before processing any input, load the marks specified in
+       <file>.  The input file must exist, must be readable, and
+       must use the same format as produced by \--export-marks.
+       Multiple options may be supplied to import more than one
+       set of marks.  If a mark is defined to different values,
+       the last file wins.
 
 --export-pack-edges=<file>::
        After creating a packfile, print a line of data to
@@ -451,7 +462,7 @@ in octal.  Git only supports the following modes:
 In both formats `<path>` is the complete path of the file to be added
 (if not already existing) or modified (if already existing).
 
-A `<path>` string must use UNIX-style directory seperators (forward
+A `<path>` string must use UNIX-style directory separators (forward
 slash `/`), may contain any byte other than `LF`, and must not
 start with double quote (`"`).
 
@@ -461,8 +472,8 @@ quoting should be used, e.g. `"path/with\n and \" in it"`.
 The value of `<path>` must be in canoncial form. That is it must not:
 
 * contain an empty directory component (e.g. `foo//bar` is invalid),
-* end with a directory seperator (e.g. `foo/` is invalid),
-* start with a directory seperator (e.g. `/foo` is invalid),
+* end with a directory separator (e.g. `foo/` is invalid),
+* start with a directory separator (e.g. `/foo` is invalid),
 * contain the special component `.` or `..` (e.g. `foo/./bar` and
   `foo/../bar` are invalid).
 
index dfdb65290fc121087df698826033020c3e8542ed..111d7c60bf1832bbfc27f8b819da77b8761236da 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 [verse]
 'git-format-patch' [-n | -k] [-o <dir> | --stdout] [--thread]
                   [--attach[=<boundary>] | --inline[=<boundary>]]
-                  [-s | --signoff] [--diff-options] [--start-number <n>]
+                  [-s | --signoff] [<common diff options>] [--start-number <n>]
                   [--in-reply-to=Message-Id] [--suffix=.<sfx>]
                   [--ignore-if-in-upstream]
                   <since>[..<until>]
@@ -47,6 +47,8 @@ reference.
 
 OPTIONS
 -------
+include::diff-options.txt[]
+
 -o|--output-directory <dir>::
        Use <dir> to store the resulting files, instead of the
        current working directory.
index 10e8c46c4c0787e6a66304ca583890a438d78bb3..3cf55111cc6ecf354b79dd1d2312a5a7b1f188db 100644 (file)
@@ -25,61 +25,126 @@ The command allows for creation and fast forwarding of sha1 refs
 local end receive-pack runs, but to the user who is sitting at
 the send-pack end, it is updating the remote.  Confused?)
 
-Before each ref is updated, if $GIT_DIR/hooks/update file exists
-and executable, it is called with three parameters:
+There are other real-world examples of using update and
+post-update hooks found in the Documentation/howto directory.
 
-       $GIT_DIR/hooks/update refname sha1-old sha1-new
+git-receive-pack honours the receive.denyNonFastForwards config
+option, which tells it if updates to a ref should be denied if they
+are not fast-forwards.
+
+OPTIONS
+-------
+<directory>::
+       The repository to sync into.
+
+pre-receive Hook
+----------------
+Before any ref is updated, if $GIT_DIR/hooks/pre-receive file exists
+and is executable, it will be invoked once, with three parameters
+per ref to be updated:
+
+       $GIT_DIR/hooks/pre-receive (refname sha1-old sha1-new)+
+
+The refname parameter is relative to $GIT_DIR; e.g. for the master
+head this is "refs/heads/master".  The two sha1 arguments after
+each refname are the object names for the refname before and after
+the update.  Refs to be created will have sha1-old equal to 0{40},
+while refs to be deleted will have sha1-new equal to 0{40}, otherwise
+sha1-old and sha1-new should be valid objects in the repository.
+
+This hook is called before any refname is updated and before any
+fast-forward checks are performed.
+
+If the pre-receive hook exits with a non-zero exit status no updates
+will be performed, and the update, post-receive and post-update
+hooks will not be invoked either.  This can be useful to quickly
+bail out if the update is not to be supported.
 
-The refname parameter is relative to $GIT_DIR; e.g. for the
-master head this is "refs/heads/master".  Two sha1 are the
-object names for the refname before and after the update.  Note
-that the hook is called before the refname is updated, so either
-sha1-old is 0{40} (meaning there is no such ref yet), or it
-should match what is recorded in refname.
+update Hook
+-----------
+Before each ref is updated, if $GIT_DIR/hooks/update file exists
+and is executable, it is invoked once per ref, with three parameters:
 
-The hook should exit with non-zero status if it wants to
-disallow updating the named ref.  Otherwise it should exit with
-zero.
+       $GIT_DIR/hooks/update refname sha1-old sha1-new
 
-Using this hook, it is easy to generate mails on updates to
-the local repository. This example script sends a mail with
-the commits pushed to the repository:
+The refname parameter is relative to $GIT_DIR; e.g. for the master
+head this is "refs/heads/master".  The two sha1 arguments are
+the object names for the refname before and after the update.
+Note that the hook is called before the refname is updated,
+so either sha1-old is 0{40} (meaning there is no such ref yet),
+or it should match what is recorded in refname.
+
+The hook should exit with non-zero status if it wants to disallow
+updating the named ref.  Otherwise it should exit with zero.
+
+Successful execution (a zero exit status) of this hook does not
+ensure the ref will actully be updated, it is only a prerequisite.
+As such it is not a good idea to send notices (e.g. email) from
+this hook.  Consider using the post-receive hook instead.
+
+post-receive Hook
+-----------------
+After all refs were updated (or attempted to be updated), if any
+ref update was successful, and if $GIT_DIR/hooks/post-receive
+file exists and is executable, it will be invoke once with three
+parameters for each successfully updated ref:
+
+       $GIT_DIR/hooks/post-receive (refname sha1-old sha1-new)+
+
+The refname parameter is relative to $GIT_DIR; e.g. for the master
+head this is "refs/heads/master".  The two sha1 arguments after
+each refname are the object names for the refname before and after
+the update.  Refs that were created will have sha1-old equal to
+0{40}, while refs that were deleted will have sha1-new equal to
+0{40}, otherwise sha1-old and sha1-new should be valid objects in
+the repository.
+
+Using this hook, it is easy to generate mails describing the updates
+to the repository.  This example script sends one mail message per
+ref listing the commits pushed to the repository:
 
        #!/bin/sh
        # mail out commit update information.
-       if expr "$2" : '0*$' >/dev/null
-       then
-               echo "Created a new ref, with the following commits:"
-               git-rev-list --pretty "$2"
-       else
-               echo "New commits:"
-               git-rev-list --pretty "$3" "^$2"
-       fi |
-       mail -s "Changes to ref $1" commit-list@mydomain
+       while test $# -gt 0
+       do
+               if expr "$2" : '0*$' >/dev/null
+               then
+                       echo "Created a new ref, with the following commits:"
+                       git-rev-list --pretty "$2"
+               else
+                       echo "New commits:"
+                       git-rev-list --pretty "$3" "^$2"
+               fi |
+               mail -s "Changes to ref $1" commit-list@mydomain
+               shift; shift; shift; # discard this ref's args
+       done
        exit 0
 
-Another hook $GIT_DIR/hooks/post-update, if exists and
-executable, is called with the list of refs that have been
-updated.  This can be used to implement repository wide cleanup
-task if needed.  The exit code from this hook invocation is
-ignored; the only thing left for git-receive-pack to do at that
-point is to exit itself anyway.  This hook can be used, for
-example, to run "git-update-server-info" if the repository is
-packed and is served via a dumb transport.
+The exit code from this hook invocation is ignored, however a
+non-zero exit code will generate an error message.
 
-       #!/bin/sh
-       exec git-update-server-info
+Note that it is possible for refname to not have sha1-new when this
+hook runs.  This can easily occur if another user modifies the ref
+after it was updated by receive-pack, but before the hook was able
+to evaluate it.  It is recommended that hooks rely on sha1-new
+rather than the current value of refname.
 
-There are other real-world examples of using update and
-post-update hooks found in the Documentation/howto directory.
+post-update Hook
+----------------
+After all other processing, if at least one ref was updated, and
+if $GIT_DIR/hooks/post-update file exists and is executable, then
+post-update will called with the list of refs that have been updated.
+This can be used to implement any repository wide cleanup tasks.
 
-git-receive-pack honours the receive.denyNonFastforwards flag, which
-tells it if updates to a ref should be denied if they are not fast-forwards.
+The exit code from this hook invocation is ignored; the only thing
+left for git-receive-pack to do at that point is to exit itself
+anyway.
 
-OPTIONS
--------
-<directory>::
-       The repository to sync into.
+This hook can be used, for example, to run "git-update-server-info"
+if the repository is packed and is served via a dumb transport.
+
+       #!/bin/sh
+       exec git-update-server-info
 
 
 SEE ALSO
index 9a7474798963c22b554f49db015c180b9ae7ea4f..e875e8318d24fa046c7cddfc3e583b4c242d9302 100644 (file)
@@ -35,14 +35,14 @@ ifdef::stalenotes[]
 You are reading the documentation for the latest version of git.
 Documentation for older releases are available here:
 
-* link:v1.5.0.2/git.html[documentation for release 1.5.0.2]
+* link:v1.5.0.3/git.html[documentation for release 1.5.0.3]
+
+* link:v1.5.0.3/RelNotes-1.5.0.3.txt[release notes for 1.5.0.3]
 
 * link:v1.5.0.2/RelNotes-1.5.0.2.txt[release notes for 1.5.0.2]
 
 * link:v1.5.0.1/RelNotes-1.5.0.1.txt[release notes for 1.5.0.1]
 
-* link:v1.5.0/git.html[documentation for release 1.5.0]
-
 * link:v1.5.0/RelNotes-1.5.0.txt[release notes for 1.5.0]
 
 * link:v1.4.4.4/git.html[documentation for release 1.4.4.4]
@@ -241,6 +241,12 @@ Identifier Terminology
        operate on a <tree> object but automatically dereferences
        <commit> and <tag> objects that point at a <tree>.
 
+<commit-ish>::
+       Indicates a commit or tag object name.  A
+       command that takes a <commit-ish> argument ultimately wants to
+       operate on a <commit> object but automatically dereferences
+       <tag> objects that point at a <commit>.
+
 <type>::
        Indicates that an object type is required.
        Currently one of: `blob`, `tree`, `commit`, or `tag`.
index b3981936e302dafb33e967b3cc17a3cab5b5659e..cd3a18eb7fa73b01e9d3a9489711292148f088e6 100755 (executable)
@@ -2,7 +2,7 @@
 
 T="$1"
 
-for h in *.html *.txt howto/*.txt howto/*.html RelNotes-*.txt
+for h in *.html *.txt howto/*.txt howto/*.html RelNotes-*.txt *.css
 do
        if test -f "$T/$h" &&
           diff -u -I'Last updated [0-9][0-9]-[A-Z][a-z][a-z]-' "$T/$h" "$h"
index e0bc552a645f482445d5be33b3b662cead324aa0..05dc7b2c7b3653c2b70850e881263e9c5236e153 100644 (file)
@@ -48,7 +48,7 @@ ($)
 ';
 
 @keys=sort {uc($a) cmp uc($b)} keys %terms;
-$pattern='(\b(?<!link:git-)'.join('\b|\b(?<!link:git-)',reverse @keys).'\b)';
+$pattern='(\b(?<!link:git-)'.join('\b|\b(?<!-)',reverse @keys).'\b)';
 foreach $key (@keys) {
        $terms{$key}=~s/$pattern/sprintf "<<ref_".no_spaces($1).",$1>>";/eg;
        print '[[ref_'.no_spaces($key).']]'.$key."::\n"
index ffd673ec335c3d85d6815dcfdc3e1bfd019f8551..d7b227e6471f6571129477c57a25d383f6b8c008 100644 (file)
@@ -437,11 +437,14 @@ We will sometimes represent git history using diagrams like the one
 below.  Commits are shown as "o", and the links between them with
 lines drawn with - / and \.  Time goes left to right:
 
+
+................................................
          o--o--o <-- Branch A
         /
  o--o--o <-- master
         \
          o--o--o <-- Branch B
+................................................
 
 If we need to talk about a particular commit, the character "o" may
 be replaced with another letter or number.
@@ -601,8 +604,8 @@ a new stanza:
 $ cat .git/config
 ...
 [remote "linux-nfs"]
-        url = git://linux-nfs.org/~bfields/git.git
-       fetch = +refs/heads/*:refs/remotes/linux-nfs-read/*
+       url = git://linux-nfs.org/pub/nfs-2.6.git
+       fetch = +refs/heads/*:refs/remotes/linux-nfs/*
 ...
 -------------------------------------------------
 
@@ -1133,17 +1136,9 @@ modified in two different ways in the remote branch and the local
 branch--then you are warned; the output may look something like this:
 
 -------------------------------------------------
-$ git pull . next
-Trying really trivial in-index merge...
-fatal: Merge requires file-level merging
-Nope.
-Merging HEAD with 77976da35a11db4580b80ae27e8d65caf5208086
-Merging:
-15e2162 world
-77976da goodbye
-found 1 common ancestor(s):
-d122ed4 initial
-Auto-merging file.txt
+$ git merge next
+ 100% (4/4) done
+Auto-merged file.txt
 CONFLICT (content): Merge conflict in file.txt
 Automatic merge failed; fix conflicts and then commit the result.
 -------------------------------------------------
@@ -1439,7 +1434,7 @@ modifying the working directory, you can do that with
 gitlink:git-show[1]:
 
 -------------------------------------------------
-$ git show HEAD^ path/to/file
+$ git show HEAD^:path/to/file
 -------------------------------------------------
 
 which will display the given version of the file.
@@ -1936,25 +1931,29 @@ $ git commit
 You have performed no merges into mywork, so it is just a simple linear
 sequence of patches on top of "origin":
 
-
+................................................
  o--o--o <-- origin
         \
          o--o--o <-- mywork
+................................................
 
 Some more interesting work has been done in the upstream project, and
 "origin" has advanced:
 
+................................................
  o--o--O--o--o--o <-- origin
         \
          a--b--c <-- mywork
+................................................
 
 At this point, you could use "pull" to merge your changes back in;
 the result would create a new merge commit, like this:
 
-
+................................................
  o--o--O--o--o--o <-- origin
         \        \
          a--b--c--m <-- mywork
+................................................
  
 However, if you prefer to keep the history in mywork a simple series of
 commits without any merges, you may instead choose to use
@@ -1971,9 +1970,11 @@ point at the latest version of origin, then apply each of the saved
 patches to the new mywork.  The result will look like:
 
 
+................................................
  o--o--O--o--o--o <-- origin
                 \
                  a'--b'--c' <-- mywork
+................................................
 
 In the process, it may discover conflicts.  In that case it will stop
 and allow you to fix the conflicts; after fixing conflicts, use "git
@@ -2081,24 +2082,30 @@ The primary problem with rewriting the history of a branch has to do
 with merging.  Suppose somebody fetches your branch and merges it into
 their branch, with a result something like this:
 
+................................................
  o--o--O--o--o--o <-- origin
         \        \
          t--t--t--m <-- their branch:
+................................................
 
 Then suppose you modify the last three commits:
 
+................................................
         o--o--o <-- new head of origin
        /
  o--o--O--o--o--o <-- old head of origin
+................................................
 
 If we examined all this history together in one repository, it will
 look like:
 
+................................................
         o--o--o <-- new head of origin
        /
  o--o--O--o--o--o <-- old head of origin
         \        \
          t--t--t--m <-- their branch:
+................................................
 
 Git has no way of knowing that the new head is an updated version of
 the old head; it treats this situation exactly the same as it would if
@@ -2159,9 +2166,11 @@ commit.  Git calls this process a "fast forward".
 
 A fast forward looks something like this:
 
+................................................
  o--o--o--o <-- old head of the branch
            \
             o--o--o <-- new head of the branch
+................................................
 
 
 In some cases it is possible that the new head will *not* actually be
@@ -2169,11 +2178,11 @@ a descendant of the old head.  For example, the developer may have
 realized she made a serious mistake, and decided to backtrack,
 resulting in a situation like:
 
+................................................
  o--o--o--o--a--b <-- old head of the branch
            \
             o--o--o <-- new head of the branch
-
-
+................................................
 
 In this case, "git fetch" will fail, and print out a warning.
 
index a221bdc027851270b9920373a3d9cb8d0fbac2e2..084b7fe1775c0527c724dd39bd710005e40499c7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,8 @@
 # The default target of this Makefile is...
 all::
 
+# Define V=1 to have a more verbose compile.
+#
 # Define NO_OPENSSL environment variable if you do not have OpenSSL.
 # This also implies MOZILLA_SHA1.
 #
@@ -180,7 +182,7 @@ SCRIPT_SH = \
        git-merge-one-file.sh git-parse-remote.sh \
        git-pull.sh git-rebase.sh \
        git-repack.sh git-request-pull.sh git-reset.sh \
-       git-revert.sh git-sh-setup.sh \
+       git-sh-setup.sh \
        git-tag.sh git-verify-tag.sh \
        git-applymbox.sh git-applypatch.sh git-am.sh \
        git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
@@ -196,7 +198,7 @@ SCRIPT_PERL = \
 
 SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
          $(patsubst %.perl,%,$(SCRIPT_PERL)) \
-         git-cherry-pick git-status git-instaweb
+         git-status git-instaweb
 
 # ... and all the rest that could be moved out of bindir to gitexecdir
 PROGRAMS = \
@@ -223,7 +225,7 @@ EXTRA_PROGRAMS =
 BUILT_INS = \
        git-format-patch$X git-show$X git-whatchanged$X git-cherry$X \
        git-get-tar-commit-id$X git-init$X git-repo-config$X \
-       git-fsck-objects$X \
+       git-fsck-objects$X git-cherry-pick$X \
        $(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
 
 # what 'all' will build and 'install' will install, in gitexecdir
@@ -315,6 +317,7 @@ BUILTIN_OBJS = \
        builtin-rerere.o \
        builtin-rev-list.o \
        builtin-rev-parse.o \
+       builtin-revert.o \
        builtin-rm.o \
        builtin-runstatus.o \
        builtin-shortlog.o \
@@ -603,6 +606,31 @@ ifdef NO_PERL_MAKEMAKER
        export NO_PERL_MAKEMAKER
 endif
 
+QUIET_SUBDIR0  = $(MAKE) -C # space to separate -C and subdir
+QUIET_SUBDIR1  =
+
+ifneq ($(findstring $(MAKEFLAGS),w),w)
+PRINT_DIR = --no-print-directory
+else # "make -w"
+NO_SUBDIR = :
+endif
+
+ifneq ($(findstring $(MAKEFLAGS),s),s)
+ifndef V
+       QUIET_CC       = @echo '   ' CC $@;
+       QUIET_AR       = @echo '   ' AR $@;
+       QUIET_LINK     = @echo '   ' LINK $@;
+       QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
+       QUIET_GEN      = @echo '   ' GEN $@;
+       QUIET_SUBDIR0  = @subdir=
+       QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
+                        $(MAKE) $(PRINT_DIR) -C $$subdir
+       export V
+       export QUIET_GEN
+       export QUIET_BUILT_IN
+endif
+endif
+
 # Shell quote (do not use $(call) to accommodate ancient setups);
 
 SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
@@ -637,44 +665,43 @@ ifneq (,$X)
 endif
 
 all::
-       $(MAKE) -C git-gui all
-       $(MAKE) -C perl PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' all
-       $(MAKE) -C templates
+       $(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) all
+       $(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' all
+       $(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1)
 
 strip: $(PROGRAMS) git$X
        $(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X
 
 git$X: git.c common-cmds.h $(BUILTIN_OBJS) $(GITLIBS) GIT-CFLAGS
-       $(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
+       $(QUIET_LINK)$(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
                $(ALL_CFLAGS) -o $@ $(filter %.c,$^) \
                $(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
 
 help.o: common-cmds.h
 
 $(BUILT_INS): git$X
-       rm -f $@ && ln git$X $@
+       $(QUIET_BUILT_IN)rm -f $@ && ln git$X $@
 
 common-cmds.h: Documentation/git-*.txt
-       ./generate-cmdlist.sh > $@+
-       mv $@+ $@
+       $(QUIET_GEN)./generate-cmdlist.sh > $@+ && mv $@+ $@
 
 $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
-       rm -f $@ $@+
+       $(QUIET_GEN)rm -f $@ $@+ && \
        sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
            -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
            -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
            -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
-           $@.sh >$@+
-       chmod +x $@+
+           $@.sh >$@+ && \
+       chmod +x $@+ && \
        mv $@+ $@
 
 $(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak
 
 perl/perl.mak: GIT-CFLAGS
-       $(MAKE) -C perl PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' $(@F)
+       $(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' $(@F)
 
 $(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl
-       rm -f $@ $@+
+       $(QUIET_GEN)rm -f $@ $@+ && \
        INSTLIBDIR=`$(MAKE) -C perl -s --no-print-directory instlibdir` && \
        sed -e '1{' \
            -e '        s|#!.*perl|#!$(PERL_PATH_SQ)|' \
@@ -685,20 +712,15 @@ $(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl
            -e '}' \
            -e 's|@@INSTLIBDIR@@|'"$$INSTLIBDIR"'|g' \
            -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
-           $@.perl >$@+
-       chmod +x $@+
-       mv $@+ $@
-
-git-cherry-pick: git-revert
-       cp $< $@+
+           $@.perl >$@+ && \
+       chmod +x $@+ && \
        mv $@+ $@
 
 git-status: git-commit
-       cp $< $@+
-       mv $@+ $@
+       $(QUIET_GEN)cp $< $@+ && mv $@+ $@
 
 gitweb/gitweb.cgi: gitweb/gitweb.perl
-       rm -f $@ $@+
+       $(QUIET_GEN)rm -f $@ $@+ && \
        sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \
            -e 's|++GIT_VERSION++|$(GIT_VERSION)|g' \
            -e 's|++GIT_BINDIR++|$(bindir)|g' \
@@ -716,12 +738,12 @@ gitweb/gitweb.cgi: gitweb/gitweb.perl
            -e 's|++GITWEB_FAVICON++|$(GITWEB_FAVICON)|g' \
            -e 's|++GITWEB_SITE_HEADER++|$(GITWEB_SITE_HEADER)|g' \
            -e 's|++GITWEB_SITE_FOOTER++|$(GITWEB_SITE_FOOTER)|g' \
-           $< >$@+
-       chmod +x $@+
+           $< >$@+ && \
+       chmod +x $@+ && \
        mv $@+ $@
 
 git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css
-       rm -f $@ $@+
+       $(QUIET_GEN)rm -f $@ $@+ && \
        sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
            -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
            -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
@@ -729,15 +751,15 @@ git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css
            -e '/@@GITWEB_CGI@@/d' \
            -e '/@@GITWEB_CSS@@/r gitweb/gitweb.css' \
            -e '/@@GITWEB_CSS@@/d' \
-           $@.sh > $@+
-       chmod +x $@+
+           $@.sh > $@+ && \
+       chmod +x $@+ && \
        mv $@+ $@
 
 configure: configure.ac
-       rm -f $@ $<+
+       $(QUIET_GEN)rm -f $@ $<+ && \
        sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
-           $< > $<+
-       autoconf -o $@ $<+
+           $< > $<+ && \
+       autoconf -o $@ $<+ && \
        rm -f $<+
 
 # These can record GIT_VERSION
@@ -747,25 +769,25 @@ git$X git.spec \
        : GIT-VERSION-FILE
 
 %.o: %.c GIT-CFLAGS
-       $(CC) -o $*.o -c $(ALL_CFLAGS) $<
+       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
 %.o: %.S
-       $(CC) -o $*.o -c $(ALL_CFLAGS) $<
+       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
 
 exec_cmd.o: exec_cmd.c GIT-CFLAGS
-       $(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
+       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
 builtin-init-db.o: builtin-init-db.c GIT-CFLAGS
-       $(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
+       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
 
 http.o: http.c GIT-CFLAGS
-       $(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $<
+       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $<
 
 ifdef NO_EXPAT
 http-fetch.o: http-fetch.c http.h GIT-CFLAGS
-       $(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $<
+       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $<
 endif
 
 git-%$X: %.o $(GITLIBS)
-       $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
+       $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
 
 ssh-pull.o: ssh-fetch.c
 ssh-push.o: ssh-upload.c
@@ -779,11 +801,11 @@ git-imap-send$X: imap-send.o $(LIB_FILE)
 
 http.o http-fetch.o http-push.o: http.h
 git-http-fetch$X: fetch.o http.o http-fetch.o $(GITLIBS)
-       $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
+       $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
                $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
 
 git-http-push$X: revision.o http.o http-push.o $(GITLIBS)
-       $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
+       $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
                $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
 
 $(LIB_OBJS) $(BUILTIN_OBJS) fetch.o: $(LIB_H)
@@ -791,7 +813,7 @@ $(patsubst git-%$X,%.o,$(PROGRAMS)): $(LIB_H) $(wildcard */*.h)
 $(DIFF_OBJS): diffcore.h
 
 $(LIB_FILE): $(LIB_OBJS)
-       rm -f $@ && $(AR) rcs $@ $(LIB_OBJS)
+       $(QUIET_AR)rm -f $@ && $(AR) rcs $@ $(LIB_OBJS)
 
 XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \
        xdiff/xmerge.o
@@ -799,7 +821,7 @@ $(XDIFF_OBJS): xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
        xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
 
 $(XDIFF_LIB): $(XDIFF_OBJS)
-       rm -f $@ && $(AR) rcs $@ $(XDIFF_OBJS)
+       $(QUIET_AR)rm -f $@ && $(AR) rcs $@ $(XDIFF_OBJS)
 
 
 perl/Makefile: perl/Git.pm perl/Makefile.PL GIT-CFLAGS
index 53935109a3e320eda6177b74be76c45ee2a6e4d2..dfa17167963d1318298208e880be1cae47d06ea9 100644 (file)
@@ -1981,7 +1981,7 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *
                }
        }
        else if (patch->old_name) {
-               size = st->st_size;
+               size = xsize_t(st->st_size);
                alloc = size + 8192;
                buf = xmalloc(alloc);
                if (read_old_data(st, patch->old_name, &buf, &alloc, &size))
index 9f7dd4e19f042ce91c4c21fb73e8e3f69ca78a76..b51cdc71faeca467cd3a965db0ff84d1f087076d 100644 (file)
@@ -1244,26 +1244,26 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
  */
 struct commit_info
 {
-       char *author;
-       char *author_mail;
+       const char *author;
+       const char *author_mail;
        unsigned long author_time;
-       char *author_tz;
+       const char *author_tz;
 
        /* filled only when asked for details */
-       char *committer;
-       char *committer_mail;
+       const char *committer;
+       const char *committer_mail;
        unsigned long committer_time;
-       char *committer_tz;
+       const char *committer_tz;
 
-       char *summary;
+       const char *summary;
 };
 
 /*
  * Parse author/committer line in the commit object buffer
  */
 static void get_ac_line(const char *inbuf, const char *what,
-                       int bufsz, char *person, char **mail,
-                       unsigned long *time, char **tz)
+                       int bufsz, char *person, const char **mail,
+                       unsigned long *time, const char **tz)
 {
        int len;
        char *tmp, *endp;
@@ -1280,7 +1280,7 @@ static void get_ac_line(const char *inbuf, const char *what,
        if (bufsz <= len) {
        error_out:
                /* Ugh */
-               person = *mail = *tz = "(unknown)";
+               *mail = *tz = "(unknown)";
                *time = 0;
                return;
        }
@@ -1963,7 +1963,7 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con
                                die("Cannot lstat %s", path);
                        read_from = path;
                }
-               fin_size = st.st_size;
+               fin_size = xsize_t(st.st_size);
                buf = xmalloc(fin_size+1);
                mode = canon_mode(st.st_mode);
                switch (st.st_mode & S_IFMT) {
index d3718496553078dfb4ceac2413c758457e102592..06d8a8ce0432134f994aa30ac4133baf4ba7fef5 100644 (file)
@@ -289,12 +289,13 @@ static void print_ref_list(int kinds, int detached, int verbose, int abbrev)
        detached = (detached && (kinds & REF_LOCAL_BRANCH));
        if (detached) {
                struct ref_item item;
-               item.name = "(no branch)";
+               item.name = xstrdup("(no branch)");
                item.kind = REF_LOCAL_BRANCH;
                hashcpy(item.sha1, head_sha1);
                if (strlen(item.name) > ref_list.maxwidth)
                              ref_list.maxwidth = strlen(item.name);
                print_ref_item(&item, ref_list.maxwidth, verbose, abbrev, 1);
+               free(item.name);
        }
 
        for (i = 0; i < ref_list.index; i++) {
index d41a413b58d139283315720d9ffba95ea595cc1d..279b8f8e582665dda3c99d800094db2f5cf5af99 100644 (file)
@@ -263,6 +263,11 @@ static void show_object(struct object_array_entry *p)
        write_or_die(1, "\n", 1);
 }
 
+static void show_edge(struct commit *commit)
+{
+       ; /* nothing to do */
+}
+
 static int create_bundle(struct bundle_header *header, const char *path,
                int argc, const char **argv)
 {
@@ -341,6 +346,7 @@ static int create_bundle(struct bundle_header *header, const char *path,
        dup2(in, 1);
        close(in);
        prepare_revision_walk(&revs);
+       mark_edges_uninteresting(revs.commits, &revs, show_edge);
        traverse_commit_list(&revs, show_commit, show_object);
        close(1);
        while (waitpid(pid, &status, 0) < 0)
index f1433a4ab6ffaa6fe29fe6be9d97f02a4c4d6e87..dfa403b94baea97c655ab707d75e80f58f318c51 100644 (file)
@@ -2,7 +2,7 @@
 #include "cache.h"
 
 static const char git_config_set_usage[] =
-"git-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --list";
+"git-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --remove-section name | --list";
 
 static char *key;
 static regex_t *key_regexp;
@@ -168,6 +168,19 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                        }
                        return 0;
                }
+               else if (!strcmp(argv[1], "--remove-section")) {
+                       int ret;
+                       if (argc != 3)
+                               usage(git_config_set_usage);
+                       ret = git_config_rename_section(argv[2], NULL);
+                       if (ret < 0)
+                               return ret;
+                       if (ret == 0) {
+                               fprintf(stderr, "No such section!\n");
+                               return 1;
+                       }
+                       return 0;
+               }
                else
                        break;
                argc--;
index f5b22bb80e23aef6acde2533701b7b56150948b6..6263d8af295a5abce3e417157af7cb41e3623f38 100644 (file)
@@ -44,7 +44,7 @@ static void count_objects(DIR *d, char *path, int len, int verbose,
                        if (lstat(path, &st) || !S_ISREG(st.st_mode))
                                bad = 1;
                        else
-                               (*loose_size) += st.st_blocks;
+                               (*loose_size) += xsize_t(st.st_blocks);
                }
                if (bad) {
                        if (verbose) {
index b11ca928d6ac353de888f0e80d24578c5803d769..2b218425aab2c37a826bfbe22535f2e5b7002a26 100644 (file)
@@ -301,7 +301,7 @@ static const char *find_wholine(const char *who, int wholen, const char *buf, un
        return "";
 }
 
-static char *copy_line(const char *buf)
+static const char *copy_line(const char *buf)
 {
        const char *eol = strchr(buf, '\n');
        char *line;
@@ -315,7 +315,7 @@ static char *copy_line(const char *buf)
        return line;
 }
 
-static char *copy_name(const char *buf)
+static const char *copy_name(const char *buf)
 {
        const char *eol = strchr(buf, '\n');
        const char *eoname = strstr(buf, " <");
@@ -330,7 +330,7 @@ static char *copy_name(const char *buf)
        return line;
 }
 
-static char *copy_email(const char *buf)
+static const char *copy_email(const char *buf)
 {
        const char *email = strchr(buf, '<');
        const char *eoemail = strchr(email, '>');
index 6abf498d2b391c97e9efcdb32da1cf3b5d566397..b8e71b640b66ebd95a436a5c1c7f3fce0647be0c 100644 (file)
@@ -18,6 +18,9 @@ static int check_full;
 static int check_strict;
 static int keep_cache_objects;
 static unsigned char head_sha1[20];
+static int errors_found;
+#define ERROR_OBJECT 01
+#define ERROR_REACHABLE 02
 
 #ifdef NO_D_INO_IN_DIRENT
 #define SORT_DIRENT 0
@@ -40,6 +43,7 @@ static int objerror(struct object *obj, const char *err, ...)
 {
        va_list params;
        va_start(params, err);
+       errors_found |= ERROR_OBJECT;
        objreport(obj, "error", err, params);
        va_end(params);
        return -1;
@@ -67,9 +71,10 @@ static void check_reachable_object(struct object *obj)
         * do a full fsck
         */
        if (!obj->parsed) {
-               if (has_sha1_file(obj->sha1))
+               if (has_sha1_pack(obj->sha1, NULL))
                        return; /* it is in pack - forget about it */
                printf("missing %s %s\n", typename(obj->type), sha1_to_hex(obj->sha1));
+               errors_found |= ERROR_REACHABLE;
                return;
        }
 
@@ -88,6 +93,7 @@ static void check_reachable_object(struct object *obj)
                               typename(obj->type), sha1_to_hex(obj->sha1));
                        printf("              to %7s %s\n",
                               typename(ref->type), sha1_to_hex(ref->sha1));
+                       errors_found |= ERROR_REACHABLE;
                }
        }
 }
@@ -346,8 +352,11 @@ static int fsck_tag(struct tag *tag)
 static int fsck_sha1(unsigned char *sha1)
 {
        struct object *obj = parse_object(sha1);
-       if (!obj)
-               return error("%s: object corrupt or missing", sha1_to_hex(sha1));
+       if (!obj) {
+               errors_found |= ERROR_OBJECT;
+               return error("%s: object corrupt or missing",
+                            sha1_to_hex(sha1));
+       }
        if (obj->flags & SEEN)
                return 0;
        obj->flags |= SEEN;
@@ -359,8 +368,10 @@ static int fsck_sha1(unsigned char *sha1)
                return fsck_commit((struct commit *) obj);
        if (obj->type == OBJ_TAG)
                return fsck_tag((struct tag *) obj);
+
        /* By now, parse_object() would've returned NULL instead. */
-       return objerror(obj, "unknown type '%d' (internal fsck error)", obj->type);
+       return objerror(obj, "unknown type '%d' (internal fsck error)",
+                       obj->type);
 }
 
 /*
@@ -576,11 +587,16 @@ static int fsck_cache_tree(struct cache_tree *it)
        return err;
 }
 
+static const char fsck_usage[] =
+"git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] "
+"[--strict] <head-sha1>*]";
+
 int cmd_fsck(int argc, char **argv, const char *prefix)
 {
        int i, heads;
 
        track_object_refs = 1;
+       errors_found = 0;
 
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];
@@ -610,7 +626,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
                        continue;
                }
                if (*arg == '-')
-                       usage("git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] [--strict] <head-sha1>*]");
+                       usage(fsck_usage);
        }
 
        fsck_head_link();
@@ -632,7 +648,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
                        verify_pack(p, 0);
 
                for (p = packed_git; p; p = p->next) {
-                       int num = num_packed_objects(p);
+                       uint32_t i, num = num_packed_objects(p);
                        for (i = 0; i < num; i++) {
                                unsigned char sha1[20];
                                nth_packed_object_sha1(p, i, sha1);
@@ -690,5 +706,5 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
        }
 
        check_connectivity();
-       return 0;
+       return errors_found;
 }
index 96b70227cf073517c309dbc8b042085f1040dab5..694da5ba09d302c1e44f863070776bc3ac7f32e2 100644 (file)
@@ -122,6 +122,8 @@ static int grep_file(struct grep_opt *opt, const char *filename)
        struct stat st;
        int i;
        char *data;
+       size_t sz;
+
        if (lstat(filename, &st) < 0) {
        err_ret:
                if (errno != ENOENT)
@@ -132,11 +134,12 @@ static int grep_file(struct grep_opt *opt, const char *filename)
                return 0; /* empty file -- no grep hit */
        if (!S_ISREG(st.st_mode))
                return 0;
+       sz = xsize_t(st.st_size);
        i = open(filename, O_RDONLY);
        if (i < 0)
                goto err_ret;
-       data = xmalloc(st.st_size + 1);
-       if (st.st_size != read_in_full(i, data, st.st_size)) {
+       data = xmalloc(sz + 1);
+       if (st.st_size != read_in_full(i, data, sz)) {
                error("'%s': short read %s", filename, strerror(errno));
                close(i);
                free(data);
@@ -145,11 +148,12 @@ static int grep_file(struct grep_opt *opt, const char *filename)
        close(i);
        if (opt->relative && opt->prefix_length)
                filename += opt->prefix_length;
-       i = grep_buffer(opt, filename, data, st.st_size);
+       i = grep_buffer(opt, filename, data, sz);
        free(data);
        return i;
 }
 
+#ifdef __unix__
 static int exec_grep(int argc, const char **argv)
 {
        pid_t pid;
@@ -298,6 +302,7 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached)
        }
        return hit;
 }
+#endif
 
 static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
 {
index 766a37ebe2da56f92be3927d6ddfe46dba9386df..f54e8752fb6dd0f7f251fe6bfe7bf3b2f8cd91f3 100644 (file)
@@ -545,10 +545,10 @@ static int decode_b_segment(char *in, char *ot, char *ep)
        return 0;
 }
 
-static void convert_to_utf8(char *line, char *charset)
+static void convert_to_utf8(char *line, const char *charset)
 {
-       static char latin_one[] = "latin1";
-       char *input_charset = *charset ? charset : latin_one;
+       static const char latin_one[] = "latin1";
+       const char *input_charset = *charset ? charset : latin_one;
        char *out = reencode_string(line, metainfo_charset, input_charset);
 
        if (!out)
index 8cf24f407915e6988b86a0ee40a4884dab9f5358..f8ebad0b2f2006d619dc06814acb6024ee674eec 100644 (file)
@@ -23,7 +23,7 @@ git-pack-objects [{ -q | --progress | --all-progress }] \n\
 struct object_entry {
        unsigned char sha1[20];
        unsigned long size;     /* uncompressed size */
-       unsigned long offset;   /* offset into the final pack file;
+       off_t offset;   /* offset into the final pack file;
                                 * nonzero if already written.
                                 */
        unsigned int depth;     /* delta depth */
@@ -35,7 +35,7 @@ struct object_entry {
 #define in_pack_header_size delta_size /* only when reusing pack data */
        struct object_entry *delta;     /* delta base object */
        struct packed_git *in_pack;     /* already in pack */
-       unsigned int in_pack_offset;
+       off_t in_pack_offset;
        struct object_entry *delta_child; /* deltified objects who bases me */
        struct object_entry *delta_sibling; /* other deltified objects who
                                             * uses the same base as me
@@ -68,7 +68,7 @@ static int allow_ofs_delta;
 
 static struct object_entry **sorted_by_sha, **sorted_by_type;
 static struct object_entry *objects;
-static int nr_objects, nr_alloc, nr_result;
+static uint32_t nr_objects, nr_alloc, nr_result;
 static const char *base_name;
 static unsigned char pack_file_sha1[20];
 static int progress = 1;
@@ -101,7 +101,7 @@ static int object_ix_hashsz;
  * get the object sha1 from the main index.
  */
 struct revindex_entry {
-       unsigned int offset;
+       off_t offset;
        unsigned int nr;
 };
 struct pack_revindex {
@@ -114,10 +114,8 @@ static int pack_revindex_hashsz;
 /*
  * stats
  */
-static int written;
-static int written_delta;
-static int reused;
-static int reused_delta;
+static uint32_t written, written_delta;
+static uint32_t reused, reused_delta;
 
 static int pack_revindex_ix(struct packed_git *p)
 {
@@ -185,7 +183,7 @@ static void prepare_pack_revindex(struct pack_revindex *rix)
 }
 
 static struct revindex_entry * find_packed_object(struct packed_git *p,
-                                                 unsigned int ofs)
+                                                 off_t ofs)
 {
        int num;
        int lo, hi;
@@ -213,15 +211,14 @@ static struct revindex_entry * find_packed_object(struct packed_git *p,
        die("internal error: pack revindex corrupt");
 }
 
-static unsigned long find_packed_object_size(struct packed_git *p,
-                                            unsigned long ofs)
+static off_t find_packed_object_size(struct packed_git *p, off_t ofs)
 {
        struct revindex_entry *entry = find_packed_object(p, ofs);
        return entry[1].offset - ofs;
 }
 
 static unsigned char *find_packed_object_name(struct packed_git *p,
-                                             unsigned long ofs)
+                                             off_t ofs)
 {
        struct revindex_entry *entry = find_packed_object(p, ofs);
        return (unsigned char *)(p->index_base + 256) + 24 * entry->nr + 4;
@@ -278,8 +275,8 @@ static int encode_header(enum object_type type, unsigned long size, unsigned cha
  */
 static int check_pack_inflate(struct packed_git *p,
                struct pack_window **w_curs,
-               unsigned long offset,
-               unsigned long len,
+               off_t offset,
+               off_t len,
                unsigned long expect)
 {
        z_stream stream;
@@ -305,8 +302,8 @@ static int check_pack_inflate(struct packed_git *p,
 static void copy_pack_data(struct sha1file *f,
                struct packed_git *p,
                struct pack_window **w_curs,
-               unsigned long offset,
-               unsigned long len)
+               off_t offset,
+               off_t len)
 {
        unsigned char *in;
        unsigned int avail;
@@ -314,7 +311,7 @@ static void copy_pack_data(struct sha1file *f,
        while (len) {
                in = use_pack(p, w_curs, offset, &avail);
                if (avail > len)
-                       avail = len;
+                       avail = (unsigned int)len;
                sha1write(f, in, avail);
                offset += avail;
                len -= avail;
@@ -371,14 +368,15 @@ static int revalidate_loose_object(struct object_entry *entry,
        return check_loose_inflate(map, mapsize, size);
 }
 
-static unsigned long write_object(struct sha1file *f,
+static off_t write_object(struct sha1file *f,
                                  struct object_entry *entry)
 {
        unsigned long size;
        enum object_type type;
        void *buf;
        unsigned char header[10];
-       unsigned hdrlen, datalen;
+       unsigned hdrlen;
+       off_t datalen;
        enum object_type obj_type;
        int to_reuse = 0;
 
@@ -441,7 +439,7 @@ static unsigned long write_object(struct sha1file *f,
                         * encoding of the relative offset for the delta
                         * base from this object's position in the pack.
                         */
-                       unsigned long ofs = entry->offset - entry->delta->offset;
+                       off_t ofs = entry->offset - entry->delta->offset;
                        unsigned pos = sizeof(header) - 1;
                        header[pos] = ofs & 127;
                        while (ofs >>= 7)
@@ -462,7 +460,7 @@ static unsigned long write_object(struct sha1file *f,
        else {
                struct packed_git *p = entry->in_pack;
                struct pack_window *w_curs = NULL;
-               unsigned long offset;
+               off_t offset;
 
                if (entry->delta) {
                        obj_type = (allow_ofs_delta && entry->delta->offset) ?
@@ -472,7 +470,7 @@ static unsigned long write_object(struct sha1file *f,
                hdrlen = encode_header(obj_type, entry->size, header);
                sha1write(f, header, hdrlen);
                if (obj_type == OBJ_OFS_DELTA) {
-                       unsigned long ofs = entry->offset - entry->delta->offset;
+                       off_t ofs = entry->offset - entry->delta->offset;
                        unsigned pos = sizeof(header) - 1;
                        header[pos] = ofs & 127;
                        while (ofs >>= 7)
@@ -500,9 +498,9 @@ static unsigned long write_object(struct sha1file *f,
        return hdrlen + datalen;
 }
 
-static unsigned long write_one(struct sha1file *f,
+static off_t write_one(struct sha1file *f,
                               struct object_entry *e,
-                              unsigned long offset)
+                              off_t offset)
 {
        if (e->offset || e->preferred_base)
                /* offset starts from header size and cannot be zero
@@ -518,9 +516,9 @@ static unsigned long write_one(struct sha1file *f,
 
 static void write_pack_file(void)
 {
-       int i;
+       uint32_t i;
        struct sha1file *f;
-       unsigned long offset;
+       off_t offset;
        struct pack_header hdr;
        unsigned last_percent = 999;
        int do_progress = progress;
@@ -533,7 +531,7 @@ static void write_pack_file(void)
                f = sha1create("%s-%s.%s", base_name,
                               sha1_to_hex(object_list_sha1), "pack");
        if (do_progress)
-               fprintf(stderr, "Writing %d objects.\n", nr_result);
+               fprintf(stderr, "Writing %u objects.\n", nr_result);
 
        hdr.hdr_signature = htonl(PACK_SIGNATURE);
        hdr.hdr_version = htonl(PACK_VERSION);
@@ -558,13 +556,13 @@ static void write_pack_file(void)
                fputc('\n', stderr);
  done:
        if (written != nr_result)
-               die("wrote %d objects while expecting %d", written, nr_result);
+               die("wrote %u objects while expecting %u", written, nr_result);
        sha1close(f, pack_file_sha1, 1);
 }
 
 static void write_index_file(void)
 {
-       int i;
+       uint32_t i;
        struct sha1file *f = sha1create("%s-%s.%s", base_name,
                                        sha1_to_hex(object_list_sha1), "idx");
        struct object_entry **list = sorted_by_sha;
@@ -633,7 +631,7 @@ static struct object_entry *locate_object_entry(const unsigned char *sha1)
 
 static void rehash_objects(void)
 {
-       int i;
+       uint32_t i;
        struct object_entry *oe;
 
        object_ix_hashsz = nr_objects * 3;
@@ -670,16 +668,16 @@ static unsigned name_hash(const char *name)
 
 static int add_object_entry(const unsigned char *sha1, unsigned hash, int exclude)
 {
-       unsigned int idx = nr_objects;
+       uint32_t idx = nr_objects;
        struct object_entry *entry;
        struct packed_git *p;
-       unsigned int found_offset = 0;
+       off_t found_offset = 0;
        struct packed_git *found_pack = NULL;
        int ix, status = 0;
 
        if (!exclude) {
                for (p = packed_git; p; p = p->next) {
-                       unsigned long offset = find_pack_entry_one(sha1, p);
+                       off_t offset = find_pack_entry_one(sha1, p);
                        if (offset) {
                                if (incremental)
                                        return 0;
@@ -696,9 +694,8 @@ static int add_object_entry(const unsigned char *sha1, unsigned hash, int exclud
                goto already_added;
 
        if (idx >= nr_alloc) {
-               unsigned int needed = (idx + 1024) * 3 / 2;
-               objects = xrealloc(objects, needed * sizeof(*entry));
-               nr_alloc = needed;
+               nr_alloc = (idx + 1024) * 3 / 2;
+               objects = xrealloc(objects, nr_alloc * sizeof(*entry));
        }
        entry = objects + idx;
        nr_objects = idx + 1;
@@ -718,7 +715,7 @@ static int add_object_entry(const unsigned char *sha1, unsigned hash, int exclud
 
  already_added:
        if (progress_update) {
-               fprintf(stderr, "Counting objects...%d\r", nr_objects);
+               fprintf(stderr, "Counting objects...%u\r", nr_objects);
                progress_update = 0;
        }
        if (exclude)
@@ -981,17 +978,17 @@ static void check_object(struct object_entry *entry)
        if (entry->in_pack && !entry->preferred_base) {
                struct packed_git *p = entry->in_pack;
                struct pack_window *w_curs = NULL;
-               unsigned long left = p->pack_size - entry->in_pack_offset;
                unsigned long size, used;
+               unsigned int avail;
                unsigned char *buf;
                struct object_entry *base_entry = NULL;
 
-               buf = use_pack(p, &w_curs, entry->in_pack_offset, NULL);
+               buf = use_pack(p, &w_curs, entry->in_pack_offset, &avail);
 
                /* We want in_pack_type even if we do not reuse delta.
                 * There is no point not reusing non-delta representations.
                 */
-               used = unpack_object_header_gently(buf, left,
+               used = unpack_object_header_gently(buf, avail,
                                                   &entry->in_pack_type, &size);
 
                /* Check if it is delta, and the base is also an object
@@ -1000,7 +997,7 @@ static void check_object(struct object_entry *entry)
                 */
                if (!no_reuse_delta) {
                        unsigned char c, *base_name;
-                       unsigned long ofs;
+                       off_t ofs;
                        unsigned long used_0;
                        /* there is at least 20 bytes left in the pack */
                        switch (entry->in_pack_type) {
@@ -1081,7 +1078,7 @@ static unsigned int check_delta_limit(struct object_entry *me, unsigned int n)
 
 static void get_object_details(void)
 {
-       int i;
+       uint32_t i;
        struct object_entry *entry;
 
        prepare_pack_ix();
@@ -1120,7 +1117,7 @@ static int sort_comparator(const void *_a, const void *_b)
 static struct object_entry **create_sorted_list(entry_sort_t sort)
 {
        struct object_entry **list = xmalloc(nr_objects * sizeof(struct object_entry *));
-       int i;
+       uint32_t i;
 
        for (i = 0; i < nr_objects; i++)
                list[i] = objects + i;
@@ -1137,7 +1134,7 @@ static int sha1_sort(const struct object_entry *a, const struct object_entry *b)
 static struct object_entry **create_final_object_list(void)
 {
        struct object_entry **list;
-       int i, j;
+       uint32_t i, j;
 
        for (i = nr_result = 0; i < nr_objects; i++)
                if (!objects[i].preferred_base)
@@ -1279,20 +1276,20 @@ static void progress_interval(int signum)
 
 static void find_deltas(struct object_entry **list, int window, int depth)
 {
-       int i, idx;
+       uint32_t i = nr_objects, idx = 0, processed = 0;
        unsigned int array_size = window * sizeof(struct unpacked);
-       struct unpacked *array = xmalloc(array_size);
-       unsigned processed = 0;
+       struct unpacked *array;
        unsigned last_percent = 999;
 
+       if (!nr_objects)
+               return;
+       array = xmalloc(array_size);
        memset(array, 0, array_size);
-       i = nr_objects;
-       idx = 0;
        if (progress)
-               fprintf(stderr, "Deltifying %d objects.\n", nr_result);
+               fprintf(stderr, "Deltifying %u objects.\n", nr_result);
 
-       while (--i >= 0) {
-               struct object_entry *entry = list[i];
+       do {
+               struct object_entry *entry = list[--i];
                struct unpacked *n = array + idx;
                int j;
 
@@ -1325,7 +1322,7 @@ static void find_deltas(struct object_entry **list, int window, int depth)
 
                j = window;
                while (--j > 0) {
-                       unsigned int other_idx = idx + j;
+                       uint32_t other_idx = idx + j;
                        struct unpacked *m;
                        if (other_idx >= window)
                                other_idx -= window;
@@ -1345,7 +1342,7 @@ static void find_deltas(struct object_entry **list, int window, int depth)
                idx++;
                if (idx >= window)
                        idx = 0;
-       }
+       } while (i > 0);
 
        if (progress)
                fputc('\n', stderr);
@@ -1386,7 +1383,7 @@ static int reuse_cached_pack(unsigned char *sha1)
        }
 
        if (progress)
-               fprintf(stderr, "Reusing %d objects pack %s\n", nr_objects,
+               fprintf(stderr, "Reusing %u objects pack %s\n", nr_objects,
                        sha1_to_hex(sha1));
 
        if (pack_to_stdout) {
@@ -1537,7 +1534,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
        struct object_entry **list;
        int use_internal_rev_list = 0;
        int thin = 0;
-       int i;
+       uint32_t i;
        const char **rp_av;
        int rp_ac_alloc = 64;
        int rp_ac;
@@ -1670,7 +1667,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
        }
 
        if (progress)
-               fprintf(stderr, "Done counting %d objects.\n", nr_objects);
+               fprintf(stderr, "Done counting %u objects.\n", nr_objects);
        sorted_by_sha = create_final_object_list();
        if (non_empty && !nr_result)
                return 0;
@@ -1683,7 +1680,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
        }
        SHA1_Final(object_list_sha1, &ctx);
        if (progress && (nr_objects != nr_result))
-               fprintf(stderr, "Result has %d objects.\n", nr_result);
+               fprintf(stderr, "Result has %u objects.\n", nr_result);
 
        if (reuse_cached_pack(object_list_sha1))
                ;
@@ -1704,7 +1701,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
                }
        }
        if (progress)
-               fprintf(stderr, "Total %d (delta %d), reused %d (delta %d)\n",
+               fprintf(stderr, "Total %u (delta %u), reused %u (delta %u)\n",
                        written, written_delta, reused, reused_delta);
        return 0;
 }
diff --git a/builtin-revert.c b/builtin-revert.c
new file mode 100644 (file)
index 0000000..2f2dc1b
--- /dev/null
@@ -0,0 +1,399 @@
+#include "cache.h"
+#include "builtin.h"
+#include "object.h"
+#include "commit.h"
+#include "tag.h"
+#include "wt-status.h"
+#include "run-command.h"
+#include "exec_cmd.h"
+#include "utf8.h"
+
+/*
+ * This implements the builtins revert and cherry-pick.
+ *
+ * Copyright (c) 2007 Johannes E. Schindelin
+ *
+ * Based on git-revert.sh, which is
+ *
+ * Copyright (c) 2005 Linus Torvalds
+ * Copyright (c) 2005 Junio C Hamano
+ */
+
+static const char *revert_usage = "git-revert [--edit | --no-edit] [-n] <commit-ish>";
+
+static const char *cherry_pick_usage = "git-cherry-pick [--edit] [-n] [-r] [-x] <commit-ish>";
+
+static int edit;
+static int replay;
+enum { REVERT, CHERRY_PICK } action;
+static int no_commit;
+static struct commit *commit;
+static int needed_deref;
+
+static const char *me;
+
+#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
+
+static void parse_options(int argc, const char **argv)
+{
+       const char *usage_str = action == REVERT ?
+               revert_usage : cherry_pick_usage;
+       unsigned char sha1[20];
+       const char *arg;
+       int i;
+
+       if (argc < 2)
+               usage(usage_str);
+
+       for (i = 1; i < argc - 1; i++) {
+               arg = argv[i];
+               if (!strcmp(arg, "-n") || !strcmp(arg, "--no-commit"))
+                       no_commit = 1;
+               else if (!strcmp(arg, "-e") || !strcmp(arg, "--edit"))
+                       edit = 1;
+               else if (!strcmp(arg, "--no-edit"))
+                       edit = 0;
+               else if (!strcmp(arg, "-x") || !strcmp(arg, "--i-really-want-"
+                               "to-expose-my-private-commit-object-name"))
+                       replay = 0;
+               else if (strcmp(arg, "-r"))
+                       usage(usage_str);
+       }
+
+       arg = argv[argc - 1];
+       if (get_sha1(arg, sha1))
+               die ("Cannot find '%s'", arg);
+       commit = (struct commit *)parse_object(sha1);
+       if (!commit)
+               die ("Could not find %s", sha1_to_hex(sha1));
+       if (commit->object.type == OBJ_TAG) {
+               commit = (struct commit *)
+                       deref_tag((struct object *)commit, arg, strlen(arg));
+               needed_deref = 1;
+       }
+       if (commit->object.type != OBJ_COMMIT)
+               die ("'%s' does not point to a commit", arg);
+}
+
+static char *get_oneline(const char *message)
+{
+       char *result;
+       const char *p = message, *abbrev, *eol;
+       int abbrev_len, oneline_len;
+
+       if (!p)
+               die ("Could not read commit message of %s",
+                               sha1_to_hex(commit->object.sha1));
+       while (*p && (*p != '\n' || p[1] != '\n'))
+               p++;
+
+       if (*p) {
+               p += 2;
+               for (eol = p + 1; *eol && *eol != '\n'; eol++)
+                       ; /* do nothing */
+       } else
+               eol = p;
+       abbrev = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
+       abbrev_len = strlen(abbrev);
+       oneline_len = eol - p;
+       result = xmalloc(abbrev_len + 5 + oneline_len);
+       memcpy(result, abbrev, abbrev_len);
+       memcpy(result + abbrev_len, "... ", 4);
+       memcpy(result + abbrev_len + 4, p, oneline_len);
+       result[abbrev_len + 4 + oneline_len] = '\0';
+       return result;
+}
+
+char *get_encoding(const char *message)
+{
+       const char *p = message, *eol;
+
+       if (!p)
+               die ("Could not read commit message of %s",
+                               sha1_to_hex(commit->object.sha1));
+       while (*p && *p != '\n') {
+               for (eol = p + 1; *eol && *eol != '\n'; eol++)
+                       ; /* do nothing */
+               if (!prefixcmp(p, "encoding ")) {
+                       char *result = xmalloc(eol - 8 - p);
+                       strlcpy(result, p + 9, eol - 8 - p);
+                       return result;
+               }
+               p = eol;
+               if (*p == '\n')
+                       p++;
+       }
+       return NULL;
+}
+
+struct lock_file msg_file;
+static int msg_fd;
+
+static void add_to_msg(const char *string)
+{
+       int len = strlen(string);
+       if (write_in_full(msg_fd, string, len) < 0)
+               die ("Could not write to .msg");
+}
+
+static void add_message_to_msg(const char *message)
+{
+       const char *p = message;
+       while (*p && (*p != '\n' || p[1] != '\n'))
+               p++;
+
+       if (!*p)
+               add_to_msg(sha1_to_hex(commit->object.sha1));
+
+       p += 2;
+       add_to_msg(p);
+       return;
+}
+
+static void set_author_ident_env(const char *message)
+{
+       const char *p = message;
+       if (!p)
+               die ("Could not read commit message of %s",
+                               sha1_to_hex(commit->object.sha1));
+       while (*p && *p != '\n') {
+               const char *eol;
+
+               for (eol = p; *eol && *eol != '\n'; eol++)
+                       ; /* do nothing */
+               if (!prefixcmp(p, "author ")) {
+                       char *line, *pend, *email, *timestamp;
+
+                       p += 7;
+                       line = xmalloc(eol + 1 - p);
+                       memcpy(line, p, eol - p);
+                       line[eol - p] = '\0';
+                       email = strchr(line, '<');
+                       if (!email)
+                               die ("Could not extract author email from %s",
+                                       sha1_to_hex(commit->object.sha1));
+                       if (email == line)
+                               pend = line;
+                       else
+                               for (pend = email; pend != line + 1 &&
+                                               isspace(pend[-1]); pend--);
+                                       ; /* do nothing */
+                       *pend = '\0';
+                       email++;
+                       timestamp = strchr(email, '>');
+                       if (!timestamp)
+                               die ("Could not extract author email from %s",
+                                       sha1_to_hex(commit->object.sha1));
+                       *timestamp = '\0';
+                       for (timestamp++; *timestamp && isspace(*timestamp);
+                                       timestamp++)
+                               ; /* do nothing */
+                       setenv("GIT_AUTHOR_NAME", line, 1);
+                       setenv("GIT_AUTHOR_EMAIL", email, 1);
+                       setenv("GIT_AUTHOR_DATE", timestamp, 1);
+                       free(line);
+                       return;
+               }
+               p = eol;
+               if (*p == '\n')
+                       p++;
+       }
+       die ("No author information found in %s",
+                       sha1_to_hex(commit->object.sha1));
+}
+
+static int merge_recursive(const char *base_sha1,
+               const char *head_sha1, const char *head_name,
+               const char *next_sha1, const char *next_name)
+{
+       char buffer[256];
+
+       sprintf(buffer, "GITHEAD_%s", head_sha1);
+       setenv(buffer, head_name, 1);
+       sprintf(buffer, "GITHEAD_%s", next_sha1);
+       setenv(buffer, next_name, 1);
+
+       /*
+        * This three way merge is an interesting one.  We are at
+        * $head, and would want to apply the change between $commit
+        * and $prev on top of us (when reverting), or the change between
+        * $prev and $commit on top of us (when cherry-picking or replaying).
+        */
+
+       return run_command_opt(RUN_COMMAND_NO_STDIN | RUN_GIT_CMD,
+                       "merge-recursive", base_sha1, "--",
+                       head_sha1, next_sha1, NULL);
+}
+
+static int revert_or_cherry_pick(int argc, const char **argv)
+{
+       unsigned char head[20];
+       struct commit *base, *next;
+       int i;
+       char *oneline, *encoding, *reencoded_message = NULL;
+       const char *message;
+
+       git_config(git_default_config);
+       me = action == REVERT ? "revert" : "cherry-pick";
+       setenv(GIT_REFLOG_ACTION, me, 0);
+       parse_options(argc, argv);
+
+       /* this is copied from the shell script, but it's never triggered... */
+       if (action == REVERT && replay)
+               die("revert is incompatible with replay");
+
+       if (no_commit) {
+               /*
+                * We do not intend to commit immediately.  We just want to
+                * merge the differences in.
+                */
+               if (write_tree(head, 0, NULL))
+                       die ("Your index file is unmerged.");
+       } else {
+               struct wt_status s;
+
+               if (get_sha1("HEAD", head))
+                       die ("You do not have a valid HEAD");
+               wt_status_prepare(&s);
+               if (s.commitable || s.workdir_dirty)
+                       die ("Dirty index: cannot %s", me);
+               discard_cache();
+       }
+
+       if (!commit->parents)
+               die ("Cannot %s a root commit", me);
+       if (commit->parents->next)
+               die ("Cannot %s a multi-parent commit.", me);
+       if (!(message = commit->buffer))
+               die ("Cannot get commit message for %s",
+                               sha1_to_hex(commit->object.sha1));
+
+       /*
+        * "commit" is an existing commit.  We would want to apply
+        * the difference it introduces since its first parent "prev"
+        * on top of the current HEAD if we are cherry-pick.  Or the
+        * reverse of it if we are revert.
+        */
+
+       msg_fd = hold_lock_file_for_update(&msg_file, ".msg", 1);
+
+       encoding = get_encoding(message);
+       if (!encoding)
+               encoding = "utf-8";
+       if (!git_commit_encoding)
+               git_commit_encoding = "utf-8";
+       if ((reencoded_message = reencode_string(message,
+                                       git_commit_encoding, encoding)))
+               message = reencoded_message;
+
+       oneline = get_oneline(message);
+
+       if (action == REVERT) {
+               base = commit;
+               next = commit->parents->item;
+               add_to_msg("Revert ");
+               add_to_msg(find_unique_abbrev(commit->object.sha1,
+                                       DEFAULT_ABBREV));
+               add_to_msg(oneline);
+               add_to_msg("\nThis reverts commit ");
+               add_to_msg(sha1_to_hex(commit->object.sha1));
+               add_to_msg(".\n");
+       } else {
+               base = commit->parents->item;
+               next = commit;
+               set_author_ident_env(message);
+               add_message_to_msg(message);
+               if (!replay) {
+                       add_to_msg("(cherry picked from commit ");
+                       add_to_msg(sha1_to_hex(commit->object.sha1));
+                       add_to_msg(")\n");
+               }
+       }
+       if (needed_deref) {
+               add_to_msg("(original 'git ");
+               add_to_msg(me);
+               add_to_msg("' arguments: ");
+               for (i = 0; i < argc; i++) {
+                       if (i)
+                               add_to_msg(" ");
+                       add_to_msg(argv[i]);
+               }
+               add_to_msg(")\n");
+       }
+
+       if (merge_recursive(sha1_to_hex(base->object.sha1),
+                               sha1_to_hex(head), "HEAD",
+                               sha1_to_hex(next->object.sha1), oneline) ||
+                       write_tree(head, 0, NULL)) {
+               const char *target = git_path("MERGE_MSG");
+               add_to_msg("\nConflicts:\n\n");
+               read_cache();
+               for (i = 0; i < active_nr;) {
+                       struct cache_entry *ce = active_cache[i++];
+                       if (ce_stage(ce)) {
+                               add_to_msg("\t");
+                               add_to_msg(ce->name);
+                               add_to_msg("\n");
+                               while (i < active_nr && !strcmp(ce->name,
+                                               active_cache[i]->name))
+                                       i++;
+                       }
+               }
+               if (close(msg_fd) || commit_lock_file(&msg_file) < 0)
+                       die ("Error wrapping up .msg");
+               unlink(target);
+               if (rename(".msg", target))
+                       die ("Could not move .msg to %s", target);
+               fprintf(stderr, "Automatic %s failed.  "
+                       "After resolving the conflicts,\n"
+                       "mark the corrected paths with 'git-add <paths>'\n"
+                       "and commit the result.\n", me);
+               if (action == CHERRY_PICK) {
+                       fprintf(stderr, "When commiting, use the option "
+                               "'-c %s' to retain authorship and message.\n",
+                               find_unique_abbrev(commit->object.sha1,
+                                       DEFAULT_ABBREV));
+               }
+               exit(1);
+       }
+       if (close(msg_fd) || commit_lock_file(&msg_file) < 0)
+               die ("Error wrapping up .msg");
+       fprintf(stderr, "Finished one %s.\n", me);
+
+       /*
+        *
+        * If we are cherry-pick, and if the merge did not result in
+        * hand-editing, we will hit this commit and inherit the original
+        * author date and name.
+        * If we are revert, or if our cherry-pick results in a hand merge,
+        * we had better say that the current user is responsible for that.
+        */
+
+       if (!no_commit) {
+               if (edit)
+                       return execl_git_cmd("commit", "-n", "-F", ".msg",
+                               "-e", NULL);
+               else
+                       return execl_git_cmd("commit", "-n", "-F", ".msg",
+                               NULL);
+       }
+       if (reencoded_message)
+               free(reencoded_message);
+
+       return 0;
+}
+
+int cmd_revert(int argc, const char **argv, const char *prefix)
+{
+       if (isatty(0))
+               edit = 1;
+       action = REVERT;
+       return revert_or_cherry_pick(argc, argv);
+}
+
+int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
+{
+       replay = 1;
+       action = CHERRY_PICK;
+       return revert_or_cherry_pick(argc, argv);
+}
index 2f71a2a6e2ecf556956a0271d8af9ad852d5a93c..2d7726e8b975d9977e14638cc127ed0b30d3058b 100644 (file)
@@ -217,13 +217,13 @@ static void get_from_rev(struct rev_info *rev, struct path_list *list)
 
        prepare_revision_walk(rev);
        while ((commit = get_revision(rev)) != NULL) {
-               char *author = NULL, *oneline, *buffer;
+               const char *author = NULL, *oneline, *buffer;
                int authorlen = authorlen, onelinelen;
 
                /* get author and oneline */
                for (buffer = commit->buffer; buffer && *buffer != '\0' &&
                                *buffer != '\n'; ) {
-                       char *eol = strchr(buffer, '\n');
+                       const char *eol = strchr(buffer, '\n');
 
                        if (eol == NULL)
                                eol = buffer + strlen(buffer);
index 67ae6bacda6edda2e36b974c0d36b4611ef1a9a6..c892f1f7a643b3d7e5c298837424a72cbc2c4f78 100644 (file)
@@ -721,7 +721,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                }
 
                for (i = 0; i < reflog; i++) {
-                       char *logmsg, *msg, *m;
+                       char *logmsg, *m;
+                       const char *msg;
                        unsigned long timestamp;
                        int tz;
 
index 528074b61508fbf25fe0fdc7fbfa7a5bb9930a25..c58d3e3445d0801ac3181e429365535b9ec11095 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -24,6 +24,7 @@ extern int cmd_cat_file(int argc, const char **argv, const char *prefix);
 extern int cmd_checkout_index(int argc, const char **argv, const char *prefix);
 extern int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
 extern int cmd_cherry(int argc, const char **argv, const char *prefix);
+extern int cmd_cherry_pick(int argc, const char **argv, const char *prefix);
 extern int cmd_commit_tree(int argc, const char **argv, const char *prefix);
 extern int cmd_count_objects(int argc, const char **argv, const char *prefix);
 extern int cmd_describe(int argc, const char **argv, const char *prefix);
@@ -60,6 +61,7 @@ extern int cmd_config(int argc, const char **argv, const char *prefix);
 extern int cmd_rerere(int argc, const char **argv, const char *prefix);
 extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
 extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);
+extern int cmd_revert(int argc, const char **argv, const char *prefix);
 extern int cmd_rm(int argc, const char **argv, const char *prefix);
 extern int cmd_runstatus(int argc, const char **argv, const char *prefix);
 extern int cmd_shortlog(int argc, const char **argv, const char *prefix);
diff --git a/cache.h b/cache.h
index c291163e6d2096181ddf89954d2d65953d1ba687..f172d02a653475fcf715eb5605012abf50c5621b 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -281,7 +281,6 @@ char *enter_repo(char *path, int strict);
 
 /* Read and unpack a sha1 file into memory, write memory to a sha1 file */
 extern int sha1_object_info(const unsigned char *, unsigned long *);
-extern void * unpack_sha1_file(void *map, unsigned long mapsize, enum object_type *type, unsigned long *size);
 extern void * read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size);
 extern int hash_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *sha1);
 extern int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *return_sha1);
@@ -383,7 +382,7 @@ extern struct packed_git {
 } *packed_git;
 
 struct pack_entry {
-       unsigned int offset;
+       off_t offset;
        unsigned char sha1[20];
        struct packed_git *p;
 };
@@ -422,15 +421,15 @@ extern struct packed_git *find_sha1_pack(const unsigned char *sha1,
                                         struct packed_git *packs);
 
 extern void pack_report(void);
-extern unsigned char* use_pack(struct packed_git *, struct pack_window **, unsigned long, unsigned int *);
+extern unsigned char* use_pack(struct packed_git *, struct pack_window **, off_t, unsigned int *);
 extern void unuse_pack(struct pack_window **);
 extern struct packed_git *add_packed_git(char *, int, int);
-extern int num_packed_objects(const struct packed_git *p);
-extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*);
-extern unsigned long find_pack_entry_one(const unsigned char *, struct packed_git *);
-extern void *unpack_entry(struct packed_git *, unsigned long, enum object_type *, unsigned long *);
+extern uint32_t num_packed_objects(const struct packed_git *p);
+extern int nth_packed_object_sha1(const struct packed_git *, uint32_t, unsigned char*);
+extern off_t find_pack_entry_one(const unsigned char *, struct packed_git *);
+extern void *unpack_entry(struct packed_git *, off_t, enum object_type *, unsigned long *);
 extern unsigned long unpack_object_header_gently(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep);
-extern const char *packed_object_info_detail(struct packed_git *, unsigned long, unsigned long *, unsigned long *, unsigned int *, unsigned char *);
+extern const char *packed_object_info_detail(struct packed_git *, off_t, unsigned long *, unsigned long *, unsigned int *, unsigned char *);
 
 /* Dumb servers support */
 extern int update_server_info(int);
@@ -451,7 +450,7 @@ extern char git_default_email[MAX_GITNAME];
 extern char git_default_name[MAX_GITNAME];
 
 extern char *git_commit_encoding;
-extern char *git_log_output_encoding;
+extern const char *git_log_output_encoding;
 
 extern int copy_fd(int ifd, int ofd);
 extern int read_in_full(int fd, void *buf, size_t count);
index 6d928f282a490a1295b11e31756e20b32cbc3822..3a9b32f6b8882f3adb91e5833c205635657a98b7 100644 (file)
@@ -684,7 +684,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
                        goto deleted_file;
 
                if (S_ISLNK(st.st_mode)) {
-                       size_t len = st.st_size;
+                       size_t len = xsize_t(st.st_size);
                        result_size = len;
                        result = xmalloc(len + 1);
                        if (result_size != readlink(elem->path, result, len)) {
@@ -697,7 +697,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
                }
                else if (0 <= (fd = open(elem->path, O_RDONLY)) &&
                         !fstat(fd, &st)) {
-                       size_t len = st.st_size;
+                       size_t len = xsize_t(st.st_size);
                        size_t sz = 0;
                        int is_file, i;
 
index 555252734298540ffc5678ac5d80888fd23dd4e5..5b9234e12e8d1ef46d0d53b15cea850dfbde14c2 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -651,7 +651,7 @@ static char *get_header(const struct commit *commit, const char *key)
        }
 }
 
-static char *replace_encoding_header(char *buf, char *encoding)
+static char *replace_encoding_header(char *buf, const char *encoding)
 {
        char *encoding_header = strstr(buf, "\nencoding ");
        char *end_of_encoding_header;
@@ -694,29 +694,26 @@ static char *replace_encoding_header(char *buf, char *encoding)
 }
 
 static char *logmsg_reencode(const struct commit *commit,
-                            char *output_encoding)
+                            const char *output_encoding)
 {
+       static const char *utf8 = "utf-8";
+       const char *use_encoding;
        char *encoding;
        char *out;
-       char *utf8 = "utf-8";
 
        if (!*output_encoding)
                return NULL;
        encoding = get_header(commit, "encoding");
-       if (!encoding)
-               encoding = utf8;
-       if (!strcmp(encoding, output_encoding))
+       use_encoding = encoding ? encoding : utf8;
+       if (!strcmp(use_encoding, output_encoding))
                out = strdup(commit->buffer);
        else
                out = reencode_string(commit->buffer,
-                                     output_encoding, encoding);
+                                     output_encoding, use_encoding);
        if (out)
                out = replace_encoding_header(out, output_encoding);
 
-       if (encoding != utf8)
-               free(encoding);
-       if (!out)
-               return NULL;
+       free(encoding);
        return out;
 }
 
@@ -917,7 +914,7 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt,
        const char *msg = commit->buffer;
        int plain_non_ascii = 0;
        char *reencoded;
-       char *encoding;
+       const char *encoding;
 
        if (fmt == CMIT_FMT_USERFORMAT)
                return format_commit_message(commit, msg, buf, space);
index 7ac3947858b8d2d44a7877d65579f16353b8d4ba..a3c7b772bce1d302e60bbf02212bb4ad4da0ee7b 100644 (file)
--- a/config.c
+++ b/config.c
@@ -431,7 +431,7 @@ static struct {
        int do_not_match;
        regex_t* value_regex;
        int multi_replace;
-       off_t offset[MAX_MATCHES];
+       size_t offset[MAX_MATCHES];
        enum { START, SECTION_SEEN, SECTION_END_SEEN, KEY_SEEN } state;
        int seen;
 } store;
@@ -579,11 +579,11 @@ static int store_write_pair(int fd, const char* key, const char* value)
        return 1;
 }
 
-static int find_beginning_of_line(const char* contents, int size,
-       int offset_, int* found_bracket)
+static ssize_t find_beginning_of_line(const char* contents, size_t size,
+       size_t offset_, int* found_bracket)
 {
-       int equal_offset = size, bracket_offset = size;
-       int offset;
+       size_t equal_offset = size, bracket_offset = size;
+       ssize_t offset;
 
        for (offset = offset_-2; offset > 0 
                        && contents[offset] != '\n'; offset--)
@@ -727,7 +727,8 @@ int git_config_set_multivar(const char* key, const char* value,
        } else {
                struct stat st;
                char* contents;
-               int i, copy_begin, copy_end, new_line = 0;
+               size_t contents_sz, copy_begin, copy_end;
+               int i, new_line = 0;
 
                if (value_regex == NULL)
                        store.value_regex = NULL;
@@ -784,7 +785,8 @@ int git_config_set_multivar(const char* key, const char* value,
                }
 
                fstat(in_fd, &st);
-               contents = xmmap(NULL, st.st_size, PROT_READ,
+               contents_sz = xsize_t(st.st_size);
+               contents = xmmap(NULL, contents_sz, PROT_READ,
                        MAP_PRIVATE, in_fd, 0);
                close(in_fd);
 
@@ -793,12 +795,12 @@ int git_config_set_multivar(const char* key, const char* value,
 
                for (i = 0, copy_begin = 0; i < store.seen; i++) {
                        if (store.offset[i] == 0) {
-                               store.offset[i] = copy_end = st.st_size;
+                               store.offset[i] = copy_end = contents_sz;
                        } else if (store.state != KEY_SEEN) {
                                copy_end = store.offset[i];
                        } else
                                copy_end = find_beginning_of_line(
-                                       contents, st.st_size,
+                                       contents, contents_sz,
                                        store.offset[i]-2, &new_line);
 
                        /* write the first part of the config */
@@ -825,13 +827,13 @@ int git_config_set_multivar(const char* key, const char* value,
                }
 
                /* write the rest of the config */
-               if (copy_begin < st.st_size)
+               if (copy_begin < contents_sz)
                        if (write_in_full(fd, contents + copy_begin,
-                                         st.st_size - copy_begin) <
-                           st.st_size - copy_begin)
+                                         contents_sz - copy_begin) <
+                           contents_sz - copy_begin)
                                goto write_err_out;
 
-               munmap(contents, st.st_size);
+               munmap(contents, contents_sz);
                unlink(config_filename);
        }
 
@@ -859,9 +861,37 @@ int git_config_set_multivar(const char* key, const char* value,
 
 }
 
+static int section_name_match (const char *buf, const char *name)
+{
+       int i = 0, j = 0, dot = 0;
+       for (; buf[i] && buf[i] != ']'; i++) {
+               if (!dot && isspace(buf[i])) {
+                       dot = 1;
+                       if (name[j++] != '.')
+                               break;
+                       for (i++; isspace(buf[i]); i++)
+                               ; /* do nothing */
+                       if (buf[i] != '"')
+                               break;
+                       continue;
+               }
+               if (buf[i] == '\\' && dot)
+                       i++;
+               else if (buf[i] == '"' && dot) {
+                       for (i++; isspace(buf[i]); i++)
+                               ; /* do_nothing */
+                       break;
+               }
+               if (buf[i] != name[j++])
+                       break;
+       }
+       return (buf[i] == ']' && name[j] == 0);
+}
+
+/* if new_name == NULL, the section is removed instead */
 int git_config_rename_section(const char *old_name, const char *new_name)
 {
-       int ret = 0;
+       int ret = 0, remove = 0;
        char *config_filename;
        struct lock_file *lock = xcalloc(sizeof(struct lock_file), 1);
        int out_fd;
@@ -892,31 +922,12 @@ int git_config_rename_section(const char *old_name, const char *new_name)
                        ; /* do nothing */
                if (buf[i] == '[') {
                        /* it's a section */
-                       int j = 0, dot = 0;
-                       for (i++; buf[i] && buf[i] != ']'; i++) {
-                               if (!dot && isspace(buf[i])) {
-                                       dot = 1;
-                                       if (old_name[j++] != '.')
-                                               break;
-                                       for (i++; isspace(buf[i]); i++)
-                                               ; /* do nothing */
-                                       if (buf[i] != '"')
-                                               break;
+                       if (section_name_match (&buf[i+1], old_name)) {
+                               ret++;
+                               if (new_name == NULL) {
+                                       remove = 1;
                                        continue;
                                }
-                               if (buf[i] == '\\' && dot)
-                                       i++;
-                               else if (buf[i] == '"' && dot) {
-                                       for (i++; isspace(buf[i]); i++)
-                                               ; /* do_nothing */
-                                       break;
-                               }
-                               if (buf[i] != old_name[j++])
-                                       break;
-                       }
-                       if (buf[i] == ']' && old_name[j] == 0) {
-                               /* old_name matches */
-                               ret++;
                                store.baselen = strlen(new_name);
                                if (!store_write_section(out_fd, new_name)) {
                                        ret = write_error();
@@ -924,7 +935,10 @@ int git_config_rename_section(const char *old_name, const char *new_name)
                                }
                                continue;
                        }
+                       remove = 0;
                }
+               if (remove)
+                       continue;
                length = strlen(buf);
                if (write_in_full(out_fd, buf, length) != length) {
                        ret = write_error();
index 350846de904b31fb9dd86fee0c64613a7632c6aa..8554e3967cc692c6916e5aee35952074d07e8bf0 100644 (file)
@@ -2,7 +2,7 @@
 
 EMACS = emacs
 
-ELC = git.elc vc-git.elc
+ELC = git.elc vc-git.elc git-blame.elc
 INSTALL ?= install
 INSTALL_ELC = $(INSTALL) -m 644
 prefix ?= $(HOME)
@@ -15,6 +15,6 @@ install: all
        $(INSTALL_ELC) $(ELC) $(emacsdir)
 
 %.elc: %.el
-       $(EMACS) --batch --eval '(byte-compile-file "$<")'
+       $(EMACS) -batch -f batch-byte-compile $<
 
 clean:; rm -f $(ELC)
index 13d198229bbdf4c56f15bfbe0528c6714106e9e3..db87a37895f952a4e9b90de4b426e5c2ca7c0c0d 100644 (file)
@@ -891,36 +891,77 @@ and returns the process output as a string."
   (with-current-buffer log-edit-parent-buffer
     (git-get-filenames (git-marked-files-state 'added 'deleted 'modified))))
 
+(defun git-append-sign-off (name email)
+  "Append a Signed-off-by entry to the current buffer, avoiding duplicates."
+  (let ((sign-off (format "Signed-off-by: %s <%s>" name email))
+        (case-fold-search t))
+    (goto-char (point-min))
+    (unless (re-search-forward (concat "^" (regexp-quote sign-off)) nil t)
+      (goto-char (point-min))
+      (unless (re-search-forward "^Signed-off-by: " nil t)
+        (setq sign-off (concat "\n" sign-off)))
+      (goto-char (point-max))
+      (insert sign-off "\n"))))
+
+(defun git-setup-log-buffer (buffer &optional author-name author-email subject date msg)
+  "Setup the log buffer for a commit."
+  (unless git-status (error "Not in git-status buffer."))
+  (let ((merge-heads (git-get-merge-heads))
+        (dir default-directory)
+        (committer-name (git-get-committer-name))
+        (committer-email (git-get-committer-email))
+        (sign-off git-append-signed-off-by))
+    (with-current-buffer buffer
+      (cd dir)
+      (erase-buffer)
+      (insert
+       (propertize
+        (format "Author: %s <%s>\n%s%s"
+                (or author-name committer-name)
+                (or author-email committer-email)
+                (if date (format "Date: %s\n" date) "")
+                (if merge-heads
+                    (format "Parent: %s\n%s\n"
+                            (git-rev-parse "HEAD")
+                            (mapconcat (lambda (str) (concat "Parent: " str)) merge-heads "\n"))
+                  ""))
+        'face 'git-header-face)
+       (propertize git-log-msg-separator 'face 'git-separator-face)
+       "\n")
+      (when subject (insert subject "\n\n"))
+      (cond (msg (insert msg "\n"))
+            ((file-readable-p ".dotest/msg")
+             (insert-file-contents ".dotest/msg"))
+            ((file-readable-p ".git/MERGE_MSG")
+             (insert-file-contents ".git/MERGE_MSG")))
+      ; delete empty lines at end
+      (goto-char (point-min))
+      (when (re-search-forward "\n+\\'" nil t)
+        (replace-match "\n" t t))
+      (when sign-off (git-append-sign-off committer-name committer-email)))))
+
 (defun git-commit-file ()
   "Commit the marked file(s), asking for a commit message."
   (interactive)
   (unless git-status (error "Not in git-status buffer."))
   (let ((buffer (get-buffer-create "*git-commit*"))
-        (merge-heads (git-get-merge-heads))
-        (dir default-directory)
         (coding-system (git-get-commits-coding-system))
-        (sign-off git-append-signed-off-by))
-    (with-current-buffer buffer
-      (when (eq 0 (buffer-size))
-        (cd dir)
-        (erase-buffer)
-        (insert
-         (propertize
-          (format "Author: %s <%s>\n%s"
-                  (git-get-committer-name) (git-get-committer-email)
-                  (if merge-heads
-                      (format "Parent: %s\n%s\n"
-                              (git-rev-parse "HEAD")
-                              (mapconcat (lambda (str) (concat "Parent: " str)) merge-heads "\n"))
-                    ""))
-          'face 'git-header-face)
-         (propertize git-log-msg-separator 'face 'git-separator-face)
-         "\n")
-        (cond ((file-readable-p ".git/MERGE_MSG")
-               (insert-file-contents ".git/MERGE_MSG"))
-              (sign-off
-               (insert (format "\n\nSigned-off-by: %s <%s>\n"
-                               (git-get-committer-name) (git-get-committer-email)))))))
+        author-name author-email subject date)
+    (when (eq 0 (buffer-size buffer))
+      (when (file-readable-p ".dotest/info")
+        (with-temp-buffer
+          (insert-file-contents ".dotest/info")
+          (goto-char (point-min))
+          (when (re-search-forward "^Author: \\(.*\\)\nEmail: \\(.*\\)$" nil t)
+            (setq author-name (match-string 1))
+            (setq author-email (match-string 2)))
+          (goto-char (point-min))
+          (when (re-search-forward "^Subject: \\(.*\\)$" nil t)
+            (setq subject (match-string 1)))
+          (goto-char (point-min))
+          (when (re-search-forward "^Date: \\(.*\\)$" nil t)
+            (setq date (match-string 1)))))
+      (git-setup-log-buffer buffer author-name author-email subject date))
     (log-edit #'git-do-commit nil #'git-log-edit-files buffer)
     (setq font-lock-keywords (font-lock-compile-keywords git-log-edit-font-lock-keywords))
     (setq buffer-file-coding-system coding-system)
index b5f41ae2e38c1f7856d7f060955eed5da0aea036..4809f9199fa21dcd95ab508e26196080d49e8e88 100644 (file)
@@ -132,7 +132,7 @@ static void convert_tree(void *buffer, unsigned long size, unsigned char *result
        unsigned long orig_size = size;
 
        while (size) {
-               int len = 1+strlen(buffer);
+               size_t len = 1+strlen(buffer);
 
                convert_binary_sha1((char *) buffer + len);
 
index 778cf58244d64b1e1b14ead43c2fdf5735bd717f..6abb981534bf032d50e28eb3a14033c1b6546762 100644 (file)
@@ -30,22 +30,28 @@ static int read_directory(const char *path, struct path_list *list)
        return 0;
 }
 
+static int get_mode(const char *path, int *mode)
+{
+       struct stat st;
+
+       if (!path || !strcmp(path, "/dev/null"))
+               *mode = 0;
+       else if (!strcmp(path, "-"))
+               *mode = ntohl(create_ce_mode(0666));
+       else if (stat(path, &st))
+               return error("Could not access '%s'", path);
+       else
+               *mode = st.st_mode;
+       return 0;
+}
+
 static int queue_diff(struct diff_options *o,
                const char *name1, const char *name2)
 {
-       struct stat st;
        int mode1 = 0, mode2 = 0;
 
-       if (name1) {
-               if (stat(name1, &st))
-                       return error("Could not access '%s'", name1);
-               mode1 = st.st_mode;
-       }
-       if (name2) {
-               if (stat(name2, &st))
-                       return error("Could not access '%s'", name2);
-               mode2 = st.st_mode;
-       }
+       if (get_mode(name1, &mode1) || get_mode(name2, &mode2))
+               return -1;
 
        if (mode1 && mode2 && S_ISDIR(mode1) != S_ISDIR(mode2))
                return error("file/directory conflict: %s, %s", name1, name2);
@@ -224,7 +230,7 @@ int setup_diff_no_index(struct rev_info *revs,
 {
        int i;
        for (i = 1; i < argc; i++)
-               if (argv[i][0] != '-')
+               if (argv[i][0] != '-' || argv[i][1] == '\0')
                        break;
                else if (!strcmp(argv[i], "--")) {
                        i++;
@@ -254,9 +260,15 @@ int setup_diff_no_index(struct rev_info *revs,
 
                revs->diffopt.paths = xcalloc(2, sizeof(char*));
                for (i = 0; i < 2; i++) {
-                       const char *p;
-                       p = prefix_filename(prefix, len, argv[argc - 2 + i]);
-                       revs->diffopt.paths[i] = xstrdup(p);
+                       const char *p = argv[argc - 2 + i];
+                       /*
+                        * stdin should be spelled as '-'; if you have
+                        * path that is '-', spell it as ./-.
+                        */
+                       p = (strcmp(p, "-")
+                            ? xstrdup(prefix_filename(prefix, len, p))
+                            : p);
+                       revs->diffopt.paths[i] = p;
                }
        }
        else
diff --git a/diff.c b/diff.c
index e225de230599bb35d9fe5b219ff4b8e8de9bfd97..954ca83e0b0c95f55c0287d2deeb4cab76153fe0 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -1364,6 +1364,32 @@ static struct sha1_size_cache *locate_size_cache(unsigned char *sha1,
        return e;
 }
 
+static int populate_from_stdin(struct diff_filespec *s)
+{
+#define INCREMENT 1024
+       char *buf;
+       unsigned long size;
+       int got;
+
+       size = 0;
+       buf = NULL;
+       while (1) {
+               buf = xrealloc(buf, size + INCREMENT);
+               got = xread(0, buf + size, INCREMENT);
+               if (!got)
+                       break; /* EOF */
+               if (got < 0)
+                       return error("error while reading from stdin %s",
+                                    strerror(errno));
+               size += got;
+       }
+       s->should_munmap = 0;
+       s->data = buf;
+       s->size = size;
+       s->should_free = 1;
+       return 0;
+}
+
 /*
  * While doing rename detection and pickaxe operation, we may need to
  * grab the data for the blob (or file) for our own in-core comparison.
@@ -1389,6 +1415,9 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
                char *buf;
                unsigned long size;
 
+               if (!strcmp(s->path, "-"))
+                       return populate_from_stdin(s);
+
                if (lstat(s->path, &st) < 0) {
                        if (errno == ENOENT) {
                        err_empty:
@@ -1399,7 +1428,7 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
                                return err;
                        }
                }
-               s->size = st.st_size;
+               s->size = xsize_t(st.st_size);
                if (!s->size)
                        goto empty;
                if (size_only)
@@ -1515,12 +1544,13 @@ static void prepare_temp_file(const char *name,
                if (S_ISLNK(st.st_mode)) {
                        int ret;
                        char buf[PATH_MAX + 1]; /* ought to be SYMLINK_MAX */
+                       size_t sz = xsize_t(st.st_size);
                        if (sizeof(buf) <= st.st_size)
                                die("symlink too long: %s", name);
-                       ret = readlink(name, buf, st.st_size);
+                       ret = readlink(name, buf, sz);
                        if (ret < 0)
                                die("readlink(%s)", name);
-                       prep_temp_blob(temp, buf, st.st_size,
+                       prep_temp_blob(temp, buf, sz,
                                       (one->sha1_valid ?
                                        one->sha1 : null_sha1),
                                       (one->sha1_valid ?
@@ -1689,6 +1719,10 @@ static void diff_fill_sha1_info(struct diff_filespec *one)
        if (DIFF_FILE_VALID(one)) {
                if (!one->sha1_valid) {
                        struct stat st;
+                       if (!strcmp(one->path, "-")) {
+                               hashcpy(one->sha1, null_sha1);
+                               return;
+                       }
                        if (lstat(one->path, &st) < 0)
                                die("stat %s", one->path);
                        if (index_path(one->sha1, one->path, &st, 0))
@@ -2138,7 +2172,7 @@ static int parse_num(const char **cp_p)
        /* user says num divided by scale and we say internally that
         * is MAX_SCORE * num / scale.
         */
-       return (num >= scale) ? MAX_SCORE : (MAX_SCORE * num / scale);
+       return (int)((num >= scale) ? MAX_SCORE : (MAX_SCORE * num / scale));
 }
 
 int diff_scoreopt_parse(const char *opt)
index acb18db1db27dc29fdb76bd519174aa56f56121d..9c19b8cab778362b9d369135e743fb232a7cd295 100644 (file)
@@ -89,7 +89,7 @@ static int should_break(struct diff_filespec *src,
         * merge the surviving pair together if the score is
         * less than the minimum, after rename/copy runs.
         */
-       *merge_score_p = src_removed * MAX_SCORE / src->size;
+       *merge_score_p = (int)(src_removed * MAX_SCORE / src->size);
 
        /* Extent of damage, which counts both inserts and
         * deletes.
index 7ad09461858aa6832b828df411fd1b736f035465..2a4bd8232eb185f195c513c3509a72a92d172818 100644 (file)
@@ -14,6 +14,7 @@ static void prepare_order(const char *orderfile)
        void *map;
        char *cp, *endp;
        struct stat st;
+       size_t sz;
 
        if (order)
                return;
@@ -25,11 +26,12 @@ static void prepare_order(const char *orderfile)
                close(fd);
                return;
        }
-       map = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+       sz = xsize_t(st.st_size);
+       map = mmap(NULL, sz, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
        close(fd);
        if (map == MAP_FAILED)
                return;
-       endp = (char *) map + st.st_size;
+       endp = (char *) map + sz;
        for (pass = 0; pass < 2; pass++) {
                cnt = 0;
                cp = map;
index 91fa2bea519a39ee65dcf018b7a72885b9eeec70..79030412dbf883147f35678505ad147dc9c240a8 100644 (file)
@@ -172,7 +172,8 @@ static int estimate_similarity(struct diff_filespec *src,
                return 0; /* error but caught downstream */
 
 
-       delta_limit = base_size * (MAX_SCORE-minimum_score) / MAX_SCORE;
+       delta_limit = (unsigned long)
+               (base_size * (MAX_SCORE-minimum_score) / MAX_SCORE);
        if (diffcore_count_changes(src->data, src->size,
                                   dst->data, dst->size,
                                   &src->cnt_data, &dst->cnt_data,
@@ -186,7 +187,7 @@ static int estimate_similarity(struct diff_filespec *src,
        if (!dst->size)
                score = 0; /* should not happen */
        else
-               score = src_copied * MAX_SCORE / max_size;
+               score = (int)(src_copied * MAX_SCORE / max_size);
        return score;
 }
 
@@ -297,7 +298,7 @@ void diffcore_rename(struct diff_options *options)
                                struct diff_filespec *one = rename_src[j].one;
                                if (!is_exact_match(one, two, contents_too))
                                        continue;
-                               record_rename_pair(i, j, MAX_SCORE);
+                               record_rename_pair(i, j, (int)MAX_SCORE);
                                rename_count++;
                                break; /* we are done with this entry */
                        }
diff --git a/dir.c b/dir.c
index 32b57f0125d1b9e95345eb23a9a32fbf8444b1b8..b48e19dc09fff7d7fb1d5b48673fe4448b69a7c3 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -130,13 +130,13 @@ static int add_excludes_from_file_1(const char *fname,
 {
        struct stat st;
        int fd, i;
-       long size;
+       size_t size;
        char *buf, *entry;
 
        fd = open(fname, O_RDONLY);
        if (fd < 0 || fstat(fd, &st) < 0)
                goto err;
-       size = st.st_size;
+       size = xsize_t(st.st_size);
        if (size == 0) {
                close(fd);
                return 0;
index 49486dd9f161bd8e140c5a1b3346180ded51c069..0151ad07227d20a7f8d4a5c390d77b2aa85ef739 100644 (file)
@@ -21,7 +21,7 @@ int log_all_ref_updates = -1; /* unspecified */
 int warn_ambiguous_refs = 1;
 int repository_format_version;
 char *git_commit_encoding;
-char *git_log_output_encoding;
+const char *git_log_output_encoding;
 int shared_repository = PERM_UMASK;
 const char *apply_default_whitespace;
 int zlib_compression_level = Z_DEFAULT_COMPRESSION;
index 65e99c2e8b14840f70c027deb360d5d3c5292959..726f5ba7d2a8b16e0fb62846f3ede631d99486d3 100644 (file)
@@ -133,10 +133,6 @@ Format of STDIN stream:
 #define PACK_ID_BITS 16
 #define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)
 
-#ifndef PRIuMAX
-#define PRIuMAX "llu"
-#endif
-
 struct object_entry
 {
        struct object_entry *next;
@@ -220,7 +216,8 @@ struct branch
        const char *name;
        struct tree_entry branch_tree;
        uintmax_t last_commit;
-       unsigned int pack_id;
+       unsigned active : 1;
+       unsigned pack_id : PACK_ID_BITS;
        unsigned char sha1[20];
 };
 
@@ -252,7 +249,7 @@ typedef enum {
 
 /* Configured limits on output */
 static unsigned long max_depth = 10;
-static unsigned long max_packsize = (1LL << 32) - 1;
+static off_t max_packsize = (1LL << 32) - 1;
 static int force_update;
 
 /* Stats and misc. counters */
@@ -528,6 +525,7 @@ static struct branch *new_branch(const char *name)
        b->table_next_branch = branch_table[hc];
        b->branch_tree.versions[0].mode = S_IFDIR;
        b->branch_tree.versions[1].mode = S_IFDIR;
+       b->active = 0;
        b->pack_id = MAX_PACK_ID;
        branch_table[hc] = b;
        branch_count++;
@@ -755,7 +753,7 @@ static char *create_index(void)
 static char *keep_pack(char *curr_index_name)
 {
        static char name[PATH_MAX];
-       static char *keep_msg = "fast-import";
+       static const char *keep_msg = "fast-import";
        int keep_fd;
 
        chmod(pack_data->pack_name, 0444);
@@ -1373,16 +1371,33 @@ static void dump_marks_helper(FILE *f,
 
 static void dump_marks(void)
 {
-       if (mark_file)
-       {
-               FILE *f = fopen(mark_file, "w");
-               if (f) {
-                       dump_marks_helper(f, 0, marks);
-                       fclose(f);
-               } else
-                       failure |= error("Unable to write marks file %s: %s",
-                               mark_file, strerror(errno));
+       static struct lock_file mark_lock;
+       int mark_fd;
+       FILE *f;
+
+       if (!mark_file)
+               return;
+
+       mark_fd = hold_lock_file_for_update(&mark_lock, mark_file, 0);
+       if (mark_fd < 0) {
+               failure |= error("Unable to write marks file %s: %s",
+                       mark_file, strerror(errno));
+               return;
+       }
+
+       f = fdopen(mark_fd, "w");
+       if (!f) {
+               rollback_lock_file(&mark_lock);
+               failure |= error("Unable to write marks file %s: %s",
+                       mark_file, strerror(errno));
+               return;
        }
+
+       dump_marks_helper(f, 0, marks);
+       fclose(f);
+       if (commit_lock_file(&mark_lock))
+               failure |= error("Unable to write marks file %s: %s",
+                       mark_file, strerror(errno));
 }
 
 static void read_next_command(void)
@@ -1529,7 +1544,7 @@ static void unload_one_branch(void)
 {
        while (cur_active_branches
                && cur_active_branches >= max_active_branches) {
-               unsigned long min_commit = ULONG_MAX;
+               uintmax_t min_commit = ULONG_MAX;
                struct branch *e, *l = NULL, *p = NULL;
 
                for (e = active_branches; e; e = e->active_next_branch) {
@@ -1547,6 +1562,7 @@ static void unload_one_branch(void)
                        e = active_branches;
                        active_branches = e->active_next_branch;
                }
+               e->active = 0;
                e->active_next_branch = NULL;
                if (e->branch_tree.tree) {
                        release_tree_content_recursive(e->branch_tree.tree);
@@ -1559,10 +1575,13 @@ static void unload_one_branch(void)
 static void load_branch(struct branch *b)
 {
        load_tree(&b->branch_tree);
-       b->active_next_branch = active_branches;
-       active_branches = b;
-       cur_active_branches++;
-       branch_load_count++;
+       if (!b->active) {
+               b->active = 1;
+               b->active_next_branch = active_branches;
+               active_branches = b;
+               cur_active_branches++;
+               branch_load_count++;
+       }
 }
 
 static void file_change_m(struct branch *b)
@@ -1746,7 +1765,14 @@ static struct hash_list *cmd_merge(unsigned int *count)
                        if (oe->type != OBJ_COMMIT)
                                die("Mark :%" PRIuMAX " not a commit", idnum);
                        hashcpy(n->sha1, oe->sha1);
-               } else if (get_sha1(from, n->sha1))
+               } else if (!get_sha1(from, n->sha1)) {
+                       unsigned long size;
+                       char *buf = read_object_with_reference(n->sha1,
+                               commit_type, &size, n->sha1);
+                       if (!buf || size < 46)
+                               die("Not a valid commit: %s", from);
+                       free(buf);
+               } else
                        die("Invalid ref name or SHA1 expression: %s", from);
 
                n->next = NULL;
@@ -1967,6 +1993,40 @@ static void cmd_checkpoint(void)
        read_next_command();
 }
 
+static void import_marks(const char *input_file)
+{
+       char line[512];
+       FILE *f = fopen(input_file, "r");
+       if (!f)
+               die("cannot read %s: %s", input_file, strerror(errno));
+       while (fgets(line, sizeof(line), f)) {
+               uintmax_t mark;
+               char *end;
+               unsigned char sha1[20];
+               struct object_entry *e;
+
+               end = strchr(line, '\n');
+               if (line[0] != ':' || !end)
+                       die("corrupt mark line: %s", line);
+               *end = 0;
+               mark = strtoumax(line + 1, &end, 10);
+               if (!mark || end == line + 1
+                       || *end != ' ' || get_sha1(end + 1, sha1))
+                       die("corrupt mark line: %s", line);
+               e = find_object(sha1);
+               if (!e) {
+                       enum object_type type = sha1_object_info(sha1, NULL);
+                       if (type < 0)
+                               die("object not found: %s", sha1_to_hex(sha1));
+                       e = insert_object(sha1);
+                       e->type = type;
+                       e->pack_id = MAX_PACK_ID;
+               }
+               insert_mark(mark, e);
+       }
+       fclose(f);
+}
+
 static const char fast_import_usage[] =
 "git-fast-import [--date-format=f] [--max-pack-size=n] [--depth=n] [--active-branches=n] [--export-marks=marks.file]";
 
@@ -1975,6 +2035,12 @@ int main(int argc, const char **argv)
        int i, show_stats = 1;
 
        git_config(git_default_config);
+       alloc_objects(object_entry_alloc);
+       strbuf_init(&command_buf);
+       atom_table = xcalloc(atom_table_sz, sizeof(struct atom_str*));
+       branch_table = xcalloc(branch_table_sz, sizeof(struct branch*));
+       avail_tree_table = xcalloc(avail_tree_table_sz, sizeof(struct avail_tree_content*));
+       marks = pool_calloc(1, sizeof(struct mark_set));
 
        for (i = 1; i < argc; i++) {
                const char *a = argv[i];
@@ -1998,6 +2064,8 @@ int main(int argc, const char **argv)
                        max_depth = strtoul(a + 8, NULL, 0);
                else if (!prefixcmp(a, "--active-branches="))
                        max_active_branches = strtoul(a + 18, NULL, 0);
+               else if (!prefixcmp(a, "--import-marks="))
+                       import_marks(a + 15);
                else if (!prefixcmp(a, "--export-marks="))
                        mark_file = a + 15;
                else if (!prefixcmp(a, "--export-pack-edges=")) {
@@ -2018,14 +2086,6 @@ int main(int argc, const char **argv)
        if (i != argc)
                usage(fast_import_usage);
 
-       alloc_objects(object_entry_alloc);
-       strbuf_init(&command_buf);
-
-       atom_table = xcalloc(atom_table_sz, sizeof(struct atom_str*));
-       branch_table = xcalloc(branch_table_sz, sizeof(struct branch*));
-       avail_tree_table = xcalloc(avail_tree_table_sz, sizeof(struct avail_tree_content*));
-       marks = pool_calloc(1, sizeof(struct mark_set));
-
        start_packfile();
        for (;;) {
                read_next_command();
index 0fcb156d14298e23658b6f495d7ed201b260834e..c1e7c1ddcbbf45995b53785a0f39314f6d499d2c 100755 (executable)
@@ -89,7 +89,11 @@ END
 # values associated with keys:
 #   =1 - Arch version / git 'branch' detected via abrowse on a limit
 #   >1 - Arch version / git 'branch' of an auxiliary branch we've merged
-my %arch_branches = map { $_ => 1 } @ARGV;
+my %arch_branches = map { my $branch = $_; $branch =~ s/:[^:]*$//; $branch => 1 } @ARGV;
+
+# $branch_name_map:
+# maps arch branches to git branch names
+my %branch_name_map = map { m/^(.*):([^:]*)$/; $1 => $2 } grep { m/:/ } @ARGV;
 
 $ENV{'TMPDIR'} = $opt_t if $opt_t; # $ENV{TMPDIR} will affect tempdir() calls:
 my $tmp = tempdir('git-archimport-XXXXXX', TMPDIR => 1, CLEANUP => 1);
@@ -104,6 +108,7 @@ END
     closedir DIR
 }
 
+my $default_archive;           # default Arch archive
 my %reachable = ();             # Arch repositories we can access
 my %unreachable = ();           # Arch repositories we can't access :<
 my @psets  = ();                # the collection
@@ -303,7 +308,34 @@ sub old_style_branchname {
     return $ret;
 }
 
-*git_branchname = $opt_o ? *old_style_branchname : *tree_dirname;
+*git_default_branchname = $opt_o ? *old_style_branchname : *tree_dirname;
+
+# retrieve default archive, since $branch_name_map keys might not include it
+sub get_default_archive {
+    if (!defined $default_archive) {
+        $default_archive = safe_pipe_capture($TLA,'my-default-archive');
+        chomp $default_archive;
+    }
+    return $default_archive;
+}
+
+sub git_branchname {
+    my $revision = shift;
+    my $name = extract_versionname($revision);
+
+    if (exists $branch_name_map{$name}) {
+       return $branch_name_map{$name};
+
+    } elsif ($name =~ m#^([^/]*)/(.*)$#
+            && $1 eq get_default_archive()
+            && exists $branch_name_map{$2}) {
+       # the names given in the command-line lacked the archive.
+       return $branch_name_map{$2};
+
+    } else {
+       return git_default_branchname($revision);
+    }
+}
 
 sub process_patchset_accurate {
     my $ps = shift;
@@ -333,19 +365,23 @@ sub process_patchset_accurate {
         if ($ps->{tag} && (my $branchpoint = eval { ptag($ps->{tag}) })) {
             
             # find where we are supposed to branch from
-            system('git-checkout','-f','-b',$ps->{branch},
-                            $branchpoint) == 0 or die "$! $?\n";
-            
+           if (! -e "$git_dir/refs/heads/$ps->{branch}") {
+               system('git-branch',$ps->{branch},$branchpoint) == 0 or die "$! $?\n";
+
+               # We trust Arch with the fact that this is just a tag,
+               # and it does not affect the state of the tree, so
+               # we just tag and move on.  If the user really wants us
+               # to consolidate more branches into one, don't tag because
+               # the tag name would be already taken.
+               tag($ps->{id}, $branchpoint);
+               ptag($ps->{id}, $branchpoint);
+               print " * Tagged $ps->{id} at $branchpoint\n";
+           }
+           system('git-checkout','-f',$ps->{branch}) == 0 or die "$! $?\n";
+
             # remove any old stuff that got leftover:
             my $rm = safe_pipe_capture('git-ls-files','--others','-z');
             rmtree(split(/\0/,$rm)) if $rm;
-
-            # 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";
             return 0;
         } else {
             warn "Tagging from unknown id unsupported\n" if $ps->{tag};
@@ -385,14 +421,19 @@ sub process_patchset_fast {
                 unless $branchpoint;
             
             # find where we are supposed to branch from
-            system('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";
+           if (! -e "$git_dir/refs/heads/$ps->{branch}") {
+               system('git-branch',$ps->{branch},$branchpoint) == 0 or die "$! $?\n";
+
+               # We trust Arch with the fact that this is just a tag,
+               # and it does not affect the state of the tree, so
+               # we just tag and move on.  If the user really wants us
+               # to consolidate more branches into one, don't tag because
+               # the tag name would be already taken.
+               tag($ps->{id}, $branchpoint);
+               ptag($ps->{id}, $branchpoint);
+               print " * Tagged $ps->{id} at $branchpoint\n";
+            }
+            system('git-checkout',$ps->{branch}) == 0 or die "$! $?\n";
             return 0;
         } 
         die $! if $?;
@@ -830,8 +871,9 @@ sub tag {
     if ($opt_o) {
         $tag =~ s|/|--|g;
     } else {
-        # don't use subdirs for tags yet, it could screw up other porcelains
-        $tag =~ s|/|,|g;
+       my $patchname = $tag;
+       $patchname =~ s/.*--//;
+        $tag = git_branchname ($tag) . '--' . $patchname;
     }
     
     if ($commit) {
index be3677c2049dca4deb35403804d5ea2d72254e7d..3656d607d5b91d8d125b5a72b6a2a00aee512618 100755 (executable)
@@ -3,7 +3,7 @@
 # Copyright (c) 2005 Linus Torvalds
 # Copyright (c) 2006 Junio C Hamano
 
-USAGE='[-a] [-s] [-v] [--no-verify] [-m <message> | -F <logfile> | (-C|-c) <commit> | --amend] [-u] [-e] [--author <author>] [[-i | -o] <path>...]'
+USAGE='[-a | --interactive] [-s] [-v] [--no-verify] [-m <message> | -F <logfile> | (-C|-c) <commit> | --amend] [-u] [-e] [--author <author>] [[-i | -o] <path>...]'
 SUBDIRECTORY_OK=Yes
 . git-sh-setup
 require_work_tree
@@ -71,6 +71,7 @@ trap '
 
 all=
 also=
+interactive=
 only=
 logfile=
 use_commit=
@@ -131,6 +132,11 @@ do
                also=t
                shift
                ;;
+       --int|--inte|--inter|--intera|--interac|--interact|--interacti|\
+       --interactiv|--interactive)
+               interactive=t
+               shift
+               ;;
        -o|--o|--on|--onl|--only)
                only=t
                shift
@@ -304,12 +310,14 @@ case "$#,$also,$only,$amend" in
        ;;
 esac
 unset only
-case "$all,$also,$#" in
-t,t,*)
-       die "Cannot use -a and -i at the same time." ;;
+case "$all,$interactive,$also,$#" in
+*t,*t,*)
+       die "Cannot use -a, --interactive or -i at the same time." ;;
 t,,[1-9]*)
        die "Paths with -a does not make sense." ;;
-,t,0)
+,t,[1-9]*)
+       die "Paths with --interactive does not make sense." ;;
+,,t,0)
        die "No paths with -i does not make sense." ;;
 esac
 
@@ -344,6 +352,9 @@ t,)
        ) || exit
        ;;
 ,)
+       if test "$interactive" = t; then
+               git add --interactive || exit
+       fi
        case "$#" in
        0)
                ;; # commit as-is
@@ -622,6 +633,9 @@ else
 fi
 ret="$?"
 rm -f "$GIT_DIR/COMMIT_MSG" "$GIT_DIR/COMMIT_EDITMSG" "$GIT_DIR/SQUASH_MSG"
+
+cd_to_toplevel
+
 if test -d "$GIT_DIR/rr-cache"
 then
        git-rerere
index 56212b2f115d0ef738c5835c42d7bf241db4576a..7534db1267bfa64a4a0cba80680fefc42177f0e8 100644 (file)
 #define PATH_MAX 4096
 #endif
 
+#ifndef PRIuMAX
+#define PRIuMAX "llu"
+#endif
+
 #ifdef __GNUC__
 #define NORETURN __attribute__((__noreturn__))
 #else
@@ -254,6 +258,11 @@ static inline ssize_t xwrite(int fd, const void *buf, size_t len)
        }
 }
 
+static inline size_t xsize_t(off_t len)
+{
+       return (size_t)len;
+}
+
 static inline int has_extension(const char *filename, const char *ext)
 {
        size_t len = strlen(filename);
index 66538ba1adb9d50b80288f9ae3c0df77758059aa..e486e8f9843ed48f06e667cfa5659e51e5a0e4d1 100644 (file)
@@ -1,5 +1,8 @@
 all::
 
+# Define V=1 to have a more verbose compile.
+#
+
 GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
 -include GIT-VERSION-FILE
@@ -19,27 +22,32 @@ ifndef INSTALL
        INSTALL = install
 endif
 
+ifndef V
+       QUIET_GEN      = @echo '   ' GEN $@;
+       QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
+endif
+
 DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
 gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
 
 git-gui: git-gui.sh GIT-VERSION-FILE CREDITS-FILE
-       rm -f $@ $@+
+       $(QUIET_GEN)rm -f $@ $@+ && \
        sed -n \
                -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
                -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
                -e '1,/^set gitgui_credits /p' \
-               $@.sh >$@+
-       cat CREDITS-FILE >>$@+
-       sed -e '1,/^set gitgui_credits /d' $@.sh >>$@+
-       chmod +x $@+
+               $@.sh >$@+ && \
+       cat CREDITS-FILE >>$@+ && \
+       sed -e '1,/^set gitgui_credits /d' $@.sh >>$@+ && \
+       chmod +x $@+ && \
        mv $@+ $@
 
 CREDITS-FILE: CREDITS-GEN .FORCE-CREDITS-FILE
-       $(SHELL_PATH) ./CREDITS-GEN
+       $(QUIET_GEN)$(SHELL_PATH) ./CREDITS-GEN
 
 $(GITGUI_BUILT_INS): git-gui
-       rm -f $@ && ln git-gui $@
+       $(QUIET_BUILT_IN)rm -f $@ && ln git-gui $@
 
 all:: $(ALL_PROGRAMS)
 
index f84ba3382b3078ee6de45bddfacd650973068303..1981827a8e8bcc2b2e43598bb06e3e6c87bd4d1d 100755 (executable)
@@ -1267,6 +1267,24 @@ proc commit_committree {fd_wt curHEAD msg} {
                return
        }
 
+       # -- Verify this wasn't an empty change.
+       #
+       if {$commit_type eq {normal}} {
+               set old_tree [git rev-parse "$PARENT^{tree}"]
+               if {$tree_id eq $old_tree} {
+                       info_popup {No changes to commit.
+
+No files were modified by this commit and it
+was not a merge commit.
+
+A rescan will be automatically started now.
+}
+                       unlock_index
+                       rescan {set ui_status_value {No changes to commit.}}
+                       return
+               }
+       }
+
        # -- Build the message.
        #
        set msg_p [gitdir COMMIT_EDITMSG]
@@ -1281,14 +1299,8 @@ proc commit_committree {fd_wt curHEAD msg} {
        # -- Create the commit.
        #
        set cmd [list git commit-tree $tree_id]
-       set parents [concat $PARENT $MERGE_HEAD]
-       if {[llength $parents] > 0} {
-               foreach p $parents {
-                       lappend cmd -p $p
-               }
-       } else {
-               # git commit-tree writes to stderr during initial commit.
-               lappend cmd 2>/dev/null
+       foreach p [concat $PARENT $MERGE_HEAD] {
+               lappend cmd -p $p
        }
        lappend cmd <$msg_p
        if {[catch {set cmt_id [eval exec $cmd]} err]} {
@@ -5256,6 +5268,12 @@ if {[is_enabled branch]} {
                -font font_ui
        lappend disable_on_lock [list .mbar.branch entryconf \
                [.mbar.branch index last] -state]
+
+       .mbar.branch add command -label {Reset...} \
+               -command do_reset_hard \
+               -font font_ui
+       lappend disable_on_lock [list .mbar.branch entryconf \
+               [.mbar.branch index last] -state]
 }
 
 # -- Commit Menu
@@ -5330,6 +5348,34 @@ if {[is_enabled multicommit] || [is_enabled singlecommit]} {
                [list .mbar.commit entryconf [.mbar.commit index last] -state]
 }
 
+# -- Merge Menu
+#
+if {[is_enabled branch]} {
+       menu .mbar.merge
+       .mbar.merge add command -label {Local Merge...} \
+               -command do_local_merge \
+               -font font_ui
+       lappend disable_on_lock \
+               [list .mbar.merge entryconf [.mbar.merge index last] -state]
+       .mbar.merge add command -label {Abort Merge...} \
+               -command do_reset_hard \
+               -font font_ui
+       lappend disable_on_lock \
+               [list .mbar.merge entryconf [.mbar.merge index last] -state]
+
+}
+
+# -- Transport Menu
+#
+if {[is_enabled transport]} {
+       menu .mbar.fetch
+
+       menu .mbar.push
+       .mbar.push add command -label {Push...} \
+               -command do_push_anywhere \
+               -font font_ui
+}
+
 if {[is_MacOSX]} {
        # -- Apple Menu (Mac OS X only)
        #
@@ -5502,28 +5548,6 @@ pack .branch.l1 -side left
 pack .branch.cb -side left -fill x
 pack .branch -side top -fill x
 
-if {[is_enabled branch]} {
-       menu .mbar.merge
-       .mbar.merge add command -label {Local Merge...} \
-               -command do_local_merge \
-               -font font_ui
-       lappend disable_on_lock \
-               [list .mbar.merge entryconf [.mbar.merge index last] -state]
-       .mbar.merge add command -label {Abort Merge...} \
-               -command do_reset_hard \
-               -font font_ui
-       lappend disable_on_lock \
-               [list .mbar.merge entryconf [.mbar.merge index last] -state]
-
-
-       menu .mbar.fetch
-
-       menu .mbar.push
-       .mbar.push add command -label {Push...} \
-               -command do_push_anywhere \
-               -font font_ui
-}
-
 # -- Main Window Layout
 #
 panedwindow .vpane -orient vertical
diff --git a/git-revert.sh b/git-revert.sh
deleted file mode 100755 (executable)
index 49f0032..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2005 Linus Torvalds
-# Copyright (c) 2005 Junio C Hamano
-#
-
-case "$0" in
-*-revert* )
-       test -t 0 && edit=-e
-       replay=
-       me=revert
-       USAGE='[--edit | --no-edit] [-n] <commit-ish>' ;;
-*-cherry-pick* )
-       replay=t
-       edit=
-       me=cherry-pick
-       USAGE='[--edit] [-n] [-r] [-x] <commit-ish>'  ;;
-* )
-       echo >&2 "What are you talking about?"
-       exit 1 ;;
-esac
-
-SUBDIRECTORY_OK=Yes ;# we will cd up
-. git-sh-setup
-require_work_tree
-cd_to_toplevel
-
-no_commit=
-while case "$#" in 0) break ;; esac
-do
-       case "$1" in
-       -n|--n|--no|--no-|--no-c|--no-co|--no-com|--no-comm|\
-           --no-commi|--no-commit)
-               no_commit=t
-               ;;
-       -e|--e|--ed|--edi|--edit)
-               edit=-e
-               ;;
-       --n|--no|--no-|--no-e|--no-ed|--no-edi|--no-edit)
-               edit=
-               ;;
-       -r)
-               : no-op ;;
-       -x|--i-really-want-to-expose-my-private-commit-object-name)
-               replay=
-               ;;
-       -*)
-               usage
-               ;;
-       *)
-               break
-               ;;
-       esac
-       shift
-done
-
-set_reflog_action "$me"
-
-test "$me,$replay" = "revert,t" && usage
-
-case "$no_commit" in
-t)
-       # We do not intend to commit immediately.  We just want to
-       # merge the differences in.
-       head=$(git-write-tree) ||
-               die "Your index file is unmerged."
-       ;;
-*)
-       head=$(git-rev-parse --verify HEAD) ||
-               die "You do not have a valid HEAD"
-       files=$(git-diff-index --cached --name-only $head) || exit
-       if [ "$files" ]; then
-               die "Dirty index: cannot $me (dirty: $files)"
-       fi
-       ;;
-esac
-
-rev=$(git-rev-parse --verify "$@") &&
-commit=$(git-rev-parse --verify "$rev^0") ||
-       die "Not a single commit $@"
-prev=$(git-rev-parse --verify "$commit^1" 2>/dev/null) ||
-       die "Cannot run $me a root commit"
-git-rev-parse --verify "$commit^2" >/dev/null 2>&1 &&
-       die "Cannot run $me a multi-parent commit."
-
-encoding=$(git config i18n.commitencoding || echo UTF-8)
-
-# "commit" is an existing commit.  We would want to apply
-# the difference it introduces since its first parent "prev"
-# on top of the current HEAD if we are cherry-pick.  Or the
-# reverse of it if we are revert.
-
-case "$me" in
-revert)
-       git show -s --pretty=oneline --encoding="$encoding" $commit |
-       sed -e '
-               s/^[^ ]* /Revert "/
-               s/$/"/
-       '
-       echo
-       echo "This reverts commit $commit."
-       test "$rev" = "$commit" ||
-       echo "(original 'git revert' arguments: $@)"
-       base=$commit next=$prev
-       ;;
-
-cherry-pick)
-       pick_author_script='
-       /^author /{
-               s/'\''/'\''\\'\'\''/g
-               h
-               s/^author \([^<]*\) <[^>]*> .*$/\1/
-               s/'\''/'\''\'\'\''/g
-               s/.*/GIT_AUTHOR_NAME='\''&'\''/p
-
-               g
-               s/^author [^<]* <\([^>]*\)> .*$/\1/
-               s/'\''/'\''\'\'\''/g
-               s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p
-
-               g
-               s/^author [^<]* <[^>]*> \(.*\)$/\1/
-               s/'\''/'\''\'\'\''/g
-               s/.*/GIT_AUTHOR_DATE='\''&'\''/p
-
-               q
-       }'
-
-       logmsg=`git show -s --pretty=raw --encoding="$encoding" "$commit"`
-       set_author_env=`echo "$logmsg" |
-       LANG=C LC_ALL=C sed -ne "$pick_author_script"`
-       eval "$set_author_env"
-       export GIT_AUTHOR_NAME
-       export GIT_AUTHOR_EMAIL
-       export GIT_AUTHOR_DATE
-
-       echo "$logmsg" |
-       sed -e '1,/^$/d' -e 's/^    //'
-       case "$replay" in
-       '')
-               echo "(cherry picked from commit $commit)"
-               test "$rev" = "$commit" ||
-               echo "(original 'git cherry-pick' arguments: $@)"
-               ;;
-       esac
-       base=$prev next=$commit
-       ;;
-
-esac >.msg
-
-eval GITHEAD_$head=HEAD
-eval GITHEAD_$next='`git show -s \
-       --pretty=oneline --encoding="$encoding" "$commit" |
-       sed -e "s/^[^ ]* //"`'
-export GITHEAD_$head GITHEAD_$next
-
-# This three way merge is an interesting one.  We are at
-# $head, and would want to apply the change between $commit
-# and $prev on top of us (when reverting), or the change between
-# $prev and $commit on top of us (when cherry-picking or replaying).
-
-git-merge-recursive $base -- $head $next &&
-result=$(git-write-tree 2>/dev/null) || {
-       mv -f .msg "$GIT_DIR/MERGE_MSG"
-       {
-           echo '
-Conflicts:
-'
-               git ls-files --unmerged |
-               sed -e 's/^[^   ]*      /       /' |
-               uniq
-       } >>"$GIT_DIR/MERGE_MSG"
-       echo >&2 "Automatic $me failed.  After resolving the conflicts,"
-       echo >&2 "mark the corrected paths with 'git-add <paths>'"
-       echo >&2 "and commit the result."
-       case "$me" in
-       cherry-pick)
-               echo >&2 "You may choose to use the following when making"
-               echo >&2 "the commit:"
-               echo >&2 "$set_author_env"
-       esac
-       exit 1
-}
-echo >&2 "Finished one $me."
-
-# If we are cherry-pick, and if the merge did not result in
-# hand-editing, we will hit this commit and inherit the original
-# author date and name.
-# If we are revert, or if our cherry-pick results in a hand merge,
-# we had better say that the current user is responsible for that.
-
-case "$no_commit" in
-'')
-       git-commit -n -F .msg $edit
-       rm -f .msg
-       ;;
-esac
diff --git a/git.c b/git.c
index 04fc99a3dd9666bb4c22c99754334aeecc08bab5..fe2b74ab79619c425d7944c02a7f37c5e218bdef 100644 (file)
--- a/git.c
+++ b/git.c
@@ -234,6 +234,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
                { "checkout-index", cmd_checkout_index, RUN_SETUP },
                { "check-ref-format", cmd_check_ref_format },
                { "cherry", cmd_cherry, RUN_SETUP },
+               { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NOT_BARE },
                { "commit-tree", cmd_commit_tree, RUN_SETUP },
                { "config", cmd_config },
                { "count-objects", cmd_count_objects, RUN_SETUP },
@@ -272,6 +273,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
                { "rerere", cmd_rerere, RUN_SETUP },
                { "rev-list", cmd_rev_list, RUN_SETUP },
                { "rev-parse", cmd_rev_parse, RUN_SETUP },
+               { "revert", cmd_revert, RUN_SETUP | NOT_BARE },
                { "rm", cmd_rm, RUN_SETUP | NOT_BARE },
                { "runstatus", cmd_runstatus, RUN_SETUP | NOT_BARE },
                { "shortlog", cmd_shortlog, RUN_SETUP | USE_PAGER },
index 653ca3cc60ef161f06bd3a6652eba7ad3453cc2e..27b5970bcadf21f2f0e294c8c34d9595f6288503 100755 (executable)
@@ -591,7 +591,7 @@ ($;%)
        my %opts = @_;
 
        $str = to_utf8($str);
-       $str = escapeHTML($str);
+       $str = $cgi->escapeHTML($str);
        if ($opts{'-nbsp'}) {
                $str =~ s/ /&nbsp;/g;
        }
@@ -605,7 +605,7 @@ sub esc_path {
        my %opts = @_;
 
        $str = to_utf8($str);
-       $str = escapeHTML($str);
+       $str = $cgi->escapeHTML($str);
        if ($opts{'-nbsp'}) {
                $str =~ s/ /&nbsp;/g;
        }
@@ -1974,17 +1974,17 @@ sub git_print_page_path {
                        $fullname .= ($fullname ? '/' : '') . $dir;
                        print $cgi->a({-href => href(action=>"tree", file_name=>$fullname,
                                                     hash_base=>$hb),
-                                     -title => esc_html($fullname)}, esc_path($dir));
+                                     -title => $fullname}, esc_path($dir));
                        print " / ";
                }
                if (defined $type && $type eq 'blob') {
                        print $cgi->a({-href => href(action=>"blob_plain", file_name=>$file_name,
                                                     hash_base=>$hb),
-                                     -title => esc_html($name)}, esc_path($basename));
+                                     -title => $name}, esc_path($basename));
                } elsif (defined $type && $type eq 'tree') {
                        print $cgi->a({-href => href(action=>"tree", file_name=>$file_name,
                                                     hash_base=>$hb),
-                                     -title => esc_html($name)}, esc_path($basename));
+                                     -title => $name}, esc_path($basename));
                        print " / ";
                } else {
                        print esc_path($basename);
index cf81a99500e9bf5fc0c0812a2172c5561dc65b68..b405864be954941dedc4b0cc0c7f7aefcf65dd2d 100644 (file)
@@ -753,7 +753,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
                  const char *keep_name, const char *keep_msg,
                  unsigned char *sha1)
 {
-       char *report = "pack";
+       const char *report = "pack";
        char name[PATH_MAX];
        int err;
 
index f992ef77533737fe2ec52dc3b662cb6cacca0ea2..fb30694f4741147bba62350f704111d3afbf8133 100644 (file)
@@ -55,7 +55,7 @@ int interpolate(char *result, int reslen,
        const char *src = orig;
        char *dest = result;
        int newlen = 0;
-       char *name, *value;
+       const char *name, *value;
        int namelen, valuelen;
        int i;
        char c;
index 190a180b587aa565ae2ae71f9eb068ad75db168f..16a26b998699a8a5a5b3472f4b57a574a292beef 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 struct interp {
-       char *name;
+       const char *name;
        char *value;
 };
 
index f248ac8c7aa0efb976528e5f7941fef1f6b5bc91..299c514128b8b6330561a1a2b8ac30324a7ac479 100644 (file)
@@ -4,12 +4,13 @@
 static int verify_packfile(struct packed_git *p,
                struct pack_window **w_curs)
 {
-       unsigned long index_size = p->index_size;
+       off_t index_size = p->index_size;
        void *index_base = p->index_base;
        SHA_CTX ctx;
        unsigned char sha1[20];
-       unsigned long offset = 0, pack_sig = p->pack_size - 20;
-       int nr_objects, err, i;
+       off_t offset = 0, pack_sig = p->pack_size - 20;
+       uint32_t nr_objects, i;
+       int err;
 
        /* Note that the pack header checks are actually performed by
         * use_pack when it first opens the pack file.  If anything
@@ -23,7 +24,7 @@ static int verify_packfile(struct packed_git *p,
                unsigned char *in = use_pack(p, w_curs, offset, &remaining);
                offset += remaining;
                if (offset > pack_sig)
-                       remaining -= offset - pack_sig;
+                       remaining -= (unsigned int)(offset - pack_sig);
                SHA1_Update(&ctx, in, remaining);
        }
        SHA1_Final(sha1, &ctx);
@@ -40,11 +41,12 @@ static int verify_packfile(struct packed_git *p,
         * we do not do scan-streaming check on the pack file.
         */
        nr_objects = num_packed_objects(p);
-       for (i = err = 0; i < nr_objects; i++) {
+       for (i = 0, err = 0; i < nr_objects; i++) {
                unsigned char sha1[20];
                void *data;
                enum object_type type;
-               unsigned long size, offset;
+               unsigned long size;
+               off_t offset;
 
                if (nth_packed_object_sha1(p, i, sha1))
                        die("internal error pack-check nth-packed-object");
@@ -74,8 +76,7 @@ static int verify_packfile(struct packed_git *p,
 
 static void show_pack_info(struct packed_git *p)
 {
-       int nr_objects, i;
-       unsigned int chain_histogram[MAX_CHAIN];
+       uint32_t nr_objects, i, chain_histogram[MAX_CHAIN];
 
        nr_objects = num_packed_objects(p);
        memset(chain_histogram, 0, sizeof(chain_histogram));
@@ -85,7 +86,7 @@ static void show_pack_info(struct packed_git *p)
                const char *type;
                unsigned long size;
                unsigned long store_size;
-               unsigned long offset;
+               off_t offset;
                unsigned int delta_chain_length;
 
                if (nth_packed_object_sha1(p, i, sha1))
@@ -99,9 +100,11 @@ static void show_pack_info(struct packed_git *p)
                                                 base_sha1);
                printf("%s ", sha1_to_hex(sha1));
                if (!delta_chain_length)
-                       printf("%-6s %lu %lu\n", type, size, offset);
+                       printf("%-6s %lu %"PRIuMAX"\n",
+                              type, size, (uintmax_t)offset);
                else {
-                       printf("%-6s %lu %lu %u %s\n", type, size, offset,
+                       printf("%-6s %lu %"PRIuMAX" %u %s\n",
+                              type, size, (uintmax_t)offset,
                               delta_chain_length, sha1_to_hex(base_sha1));
                        if (delta_chain_length < MAX_CHAIN)
                                chain_histogram[delta_chain_length]++;
@@ -123,7 +126,7 @@ static void show_pack_info(struct packed_git *p)
 
 int verify_pack(struct packed_git *p, int verbose)
 {
-       unsigned long index_size = p->index_size;
+       off_t index_size = p->index_size;
        void *index_base = p->index_base;
        SHA_CTX ctx;
        unsigned char sha1[20];
@@ -132,7 +135,7 @@ int verify_pack(struct packed_git *p, int verbose)
        ret = 0;
        /* Verify SHA1 sum of the index file */
        SHA1_Init(&ctx);
-       SHA1_Update(&ctx, index_base, index_size - 20);
+       SHA1_Update(&ctx, index_base, (unsigned int)(index_size - 20));
        SHA1_Final(sha1, &ctx);
        if (hashcmp(sha1, (unsigned char *)index_base + index_size - 20))
                ret = error("Packfile index for %s SHA1 mismatch",
index edb5524fc48b49bca5c0dd319caf348c9bda7c23..c8f7d9af7b502e12a3d36fc3b3e796e43b4f2bdb 100644 (file)
@@ -396,9 +396,9 @@ static size_t get_pack_redundancy(struct pack_list *pl)
        return ret;
 }
 
-static inline size_t pack_set_bytecount(struct pack_list *pl)
+static inline off_t pack_set_bytecount(struct pack_list *pl)
 {
-       size_t ret = 0;
+       off_t ret = 0;
        while (pl) {
                ret += pl->pack->pack_size;
                ret += pl->pack->index_size;
@@ -413,7 +413,7 @@ static void minimize(struct pack_list **min)
                *non_unique = NULL, *min_perm = NULL;
        struct pll *perm, *perm_all, *perm_ok = NULL, *new_perm;
        struct llist *missing;
-       size_t min_perm_size = (size_t)-1, perm_size;
+       off_t min_perm_size = 0, perm_size;
        int n;
 
        pl = local_packs;
@@ -461,7 +461,7 @@ static void minimize(struct pack_list **min)
        perm = perm_ok;
        while (perm) {
                perm_size = pack_set_bytecount(perm->pl);
-               if (min_perm_size > perm_size) {
+               if (!min_perm_size || min_perm_size > perm_size) {
                        min_perm_size = perm_size;
                        min_perm = perm->pl;
                }
diff --git a/path.c b/path.c
index c5d25a4b903bd92930df4004d30d4dffa6054456..6395cf23098841c16d993ae7e86b2d8dcff01cd7 100644 (file)
--- a/path.c
+++ b/path.c
@@ -252,7 +252,7 @@ char *enter_repo(char *path, int strict)
 
        if (access("objects", X_OK) == 0 && access("refs", X_OK) == 0 &&
            validate_headref("HEAD") == 0) {
-               putenv("GIT_DIR=.");
+               setenv("GIT_DIR", ".", 1);
                check_repository_format();
                return path;
        }
index 099beda873e91ebacf1068531fe194fa041ed9d6..5ec0389883555c22cece5f9e3edf04c85c6282f1 100644 (file)
@@ -6,11 +6,15 @@ makfile:=perl.mak
 PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
 prefix_SQ = $(subst ','\'',$(prefix))
 
+ifndef V
+       QUIET = @
+endif
+
 all install instlibdir: $(makfile)
-       $(MAKE) -f $(makfile) $@
+       $(QUIET)$(MAKE) -f $(makfile) $@
 
 clean:
-       test -f $(makfile) && $(MAKE) -f $(makfile) $@ || exit 0
+       $(QUIET)test -f $(makfile) && $(MAKE) -f $(makfile) $@ || exit 0
        $(RM) ppport.h
        $(RM) $(makfile)
        $(RM) $(makfile).old
@@ -29,7 +33,7 @@ $(makfile): ../GIT-CFLAGS Makefile
        echo '  echo $(instdir_SQ)' >> $@
 else
 $(makfile): Makefile.PL ../GIT-CFLAGS
-       '$(PERL_PATH_SQ)' $< PREFIX='$(prefix_SQ)'
+       $(QUIET_GEN)'$(PERL_PATH_SQ)' $< PREFIX='$(prefix_SQ)'
 endif
 
 # this is just added comfort for calling make directly in perl dir
index 4a972b4ab76edfa608704fae7f70097a0570d5ac..6339a278da1ae1b323b5abf7d2604c7afdfde4e4 100644 (file)
@@ -66,7 +66,7 @@ static int ce_compare_data(struct cache_entry *ce, struct stat *st)
        return match;
 }
 
-static int ce_compare_link(struct cache_entry *ce, unsigned long expected_size)
+static int ce_compare_link(struct cache_entry *ce, size_t expected_size)
 {
        int match = -1;
        char *target;
@@ -101,7 +101,7 @@ static int ce_modified_check_fs(struct cache_entry *ce, struct stat *st)
                        return DATA_CHANGED;
                break;
        case S_IFLNK:
-               if (ce_compare_link(ce, st->st_size))
+               if (ce_compare_link(ce, xsize_t(st->st_size)))
                        return DATA_CHANGED;
                break;
        default:
@@ -797,7 +797,7 @@ int read_cache_from(const char *path)
        }
 
        if (!fstat(fd, &st)) {
-               cache_mmap_size = st.st_size;
+               cache_mmap_size = xsize_t(st.st_size);
                errno = EINVAL;
                if (cache_mmap_size >= sizeof(struct cache_header) + 20)
                        cache_mmap = xmmap(NULL, cache_mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
index 7f1dcc045c0818db3d515755e4bf1ae0d82f9647..675c88f4924086667deddc945011f6037ee8a8eb 100644 (file)
@@ -67,18 +67,47 @@ struct command {
 
 static struct command *commands;
 
-static char update_hook[] = "hooks/update";
+static const char update_hook[] = "hooks/update";
+static const char pre_receive_hook[] = "hooks/pre-receive";
+static const char post_receive_hook[] = "hooks/post-receive";
 
-static int run_update_hook(const char *refname,
-                          char *old_hex, char *new_hex)
+static int run_hook(const char *hook_name,
+       struct command *first_cmd,
+       int single)
 {
-       int code;
+       struct command *cmd;
+       int argc, code;
+       const char **argv;
 
-       if (access(update_hook, X_OK) < 0)
+       for (argc = 0, cmd = first_cmd; cmd; cmd = cmd->next) {
+               if (!cmd->error_string)
+                       argc += 3;
+               if (single)
+                       break;
+       }
+
+       if (!argc || access(hook_name, X_OK) < 0)
                return 0;
-       code = run_command_opt(RUN_COMMAND_NO_STDIN
-               | RUN_COMMAND_STDOUT_TO_STDERR,
-               update_hook, refname, old_hex, new_hex, NULL);
+
+       argv = xmalloc(sizeof(*argv) * (2 + argc));
+       argv[0] = hook_name;
+       for (argc = 1, cmd = first_cmd; cmd; cmd = cmd->next) {
+               if (!cmd->error_string) {
+                       argv[argc++] = xstrdup(cmd->ref_name);
+                       argv[argc++] = xstrdup(sha1_to_hex(cmd->old_sha1));
+                       argv[argc++] = xstrdup(sha1_to_hex(cmd->new_sha1));
+               }
+               if (single)
+                       break;
+       }
+       argv[argc] = NULL;
+
+       code = run_command_v_opt(argv,
+               RUN_COMMAND_NO_STDIN | RUN_COMMAND_STDOUT_TO_STDERR);
+       while (--argc > 0)
+               free((char*)argv[argc]);
+       free(argv);
+
        switch (code) {
        case 0:
                return 0;
@@ -91,37 +120,31 @@ static int run_update_hook(const char *refname,
        case -ERR_RUN_COMMAND_WAITPID_WRONG_PID:
                return error("waitpid is confused");
        case -ERR_RUN_COMMAND_WAITPID_SIGNAL:
-               return error("%s died of signal", update_hook);
+               return error("%s died of signal", hook_name);
        case -ERR_RUN_COMMAND_WAITPID_NOEXIT:
-               return error("%s died strangely", update_hook);
+               return error("%s died strangely", hook_name);
        default:
-               error("%s exited with error code %d", update_hook, -code);
+               error("%s exited with error code %d", hook_name, -code);
                return -code;
        }
 }
 
-static int update(struct command *cmd)
+static const char *update(struct command *cmd)
 {
        const char *name = cmd->ref_name;
        unsigned char *old_sha1 = cmd->old_sha1;
        unsigned char *new_sha1 = cmd->new_sha1;
-       char new_hex[41], old_hex[41];
        struct ref_lock *lock;
 
-       cmd->error_string = NULL;
        if (!prefixcmp(name, "refs/") && check_ref_format(name + 5)) {
-               cmd->error_string = "funny refname";
-               return error("refusing to create funny ref '%s' locally",
-                            name);
+               error("refusing to create funny ref '%s' locally", name);
+               return "funny refname";
        }
 
-       strcpy(new_hex, sha1_to_hex(new_sha1));
-       strcpy(old_hex, sha1_to_hex(old_sha1));
-
        if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
-               cmd->error_string = "bad pack";
-               return error("unpack should have generated %s, "
-                            "but I can't find it!", new_hex);
+               error("unpack should have generated %s, "
+                     "but I can't find it!", sha1_to_hex(new_sha1));
+               return "bad pack";
        }
        if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
            !is_null_sha1(old_sha1) &&
@@ -136,32 +159,39 @@ static int update(struct command *cmd)
                        if (!hashcmp(old_sha1, ent->item->object.sha1))
                                break;
                free_commit_list(bases);
-               if (!ent)
-                       return error("denying non-fast forward;"
-                                    " you should pull first");
+               if (!ent) {
+                       error("denying non-fast forward %s"
+                             " (you should pull first)", name);
+                       return "non-fast forward";
+               }
        }
-       if (run_update_hook(name, old_hex, new_hex)) {
-               cmd->error_string = "hook declined";
-               return error("hook declined to update %s", name);
+       if (run_hook(update_hook, cmd, 1)) {
+               error("hook declined to update %s", name);
+               return "hook declined";
        }
 
        if (is_null_sha1(new_sha1)) {
                if (delete_ref(name, old_sha1)) {
-                       cmd->error_string = "failed to delete";
-                       return error("failed to delete %s", name);
+                       error("failed to delete %s", name);
+                       return "failed to delete";
                }
-               fprintf(stderr, "%s: %s -> deleted\n", name, old_hex);
+               fprintf(stderr, "%s: %s -> deleted\n", name,
+                       sha1_to_hex(old_sha1));
+               return NULL; /* good */
        }
        else {
                lock = lock_any_ref_for_update(name, old_sha1);
                if (!lock) {
-                       cmd->error_string = "failed to lock";
-                       return error("failed to lock %s", name);
+                       error("failed to lock %s", name);
+                       return "failed to lock";
+               }
+               if (write_ref_sha1(lock, new_sha1, "push")) {
+                       return "failed to write"; /* error() already called */
                }
-               write_ref_sha1(lock, new_sha1, "push");
-               fprintf(stderr, "%s: %s -> %s\n", name, old_hex, new_hex);
+               fprintf(stderr, "%s: %s -> %s\n", name,
+                       sha1_to_hex(old_sha1), sha1_to_hex(new_sha1));
+               return NULL; /* good */
        }
-       return 0;
 }
 
 static char update_post_hook[] = "hooks/post-update";
@@ -172,14 +202,14 @@ static void run_update_post_hook(struct command *cmd)
        int argc;
        const char **argv;
 
-       if (access(update_post_hook, X_OK) < 0)
-               return;
-       for (argc = 1, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
+       for (argc = 0, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
                if (cmd_p->error_string)
                        continue;
                argc++;
        }
-       argv = xmalloc(sizeof(*argv) * (1 + argc));
+       if (!argc || access(update_post_hook, X_OK) < 0)
+               return;
+       argv = xmalloc(sizeof(*argv) * (2 + argc));
        argv[0] = update_post_hook;
 
        for (argc = 1, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
@@ -196,19 +226,30 @@ static void run_update_post_hook(struct command *cmd)
                | RUN_COMMAND_STDOUT_TO_STDERR);
 }
 
-/*
- * This gets called after(if) we've successfully
- * unpacked the data payload.
- */
-static void execute_commands(void)
+static void execute_commands(const char *unpacker_error)
 {
        struct command *cmd = commands;
 
+       if (unpacker_error) {
+               while (cmd) {
+                       cmd->error_string = "n/a (unpacker error)";
+                       cmd = cmd->next;
+               }
+               return;
+       }
+
+       if (run_hook(pre_receive_hook, commands, 0)) {
+               while (cmd) {
+                       cmd->error_string = "pre-receive hook declined";
+                       cmd = cmd->next;
+               }
+               return;
+       }
+
        while (cmd) {
-               update(cmd);
+               cmd->error_string = update(cmd);
                cmd = cmd->next;
        }
-       run_update_post_hook(commands);
 }
 
 static void read_head_info(void)
@@ -244,7 +285,7 @@ static void read_head_info(void)
                hashcpy(cmd->old_sha1, old_sha1);
                hashcpy(cmd->new_sha1, new_sha1);
                memcpy(cmd->ref_name, line + 82, len - 81);
-               cmd->error_string = "n/a (unpacker error)";
+               cmd->error_string = NULL;
                cmd->next = NULL;
                *p = cmd;
                p = &cmd->next;
@@ -447,12 +488,13 @@ int main(int argc, char **argv)
 
                if (!delete_only(commands))
                        unpack_status = unpack();
-               if (!unpack_status)
-                       execute_commands();
+               execute_commands(unpack_status);
                if (pack_lockfile)
                        unlink(pack_lockfile);
                if (report_status)
                        report(unpack_status);
+               run_hook(post_receive_hook, commands, 0);
+               run_update_post_hook(commands);
        }
        return 0;
 }
diff --git a/refs.c b/refs.c
index 7a1f89caad17cfb090e683c9888537666e8398b9..9f1fb68d047b62622598379706fa08960f6995f8 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -921,6 +921,8 @@ static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,
                                     log_file, strerror(errno));
        }
 
+       adjust_shared_perm(log_file);
+
        msglen = 0;
        if (msg) {
                /* clean up the message and make sure it is a single line */
@@ -1075,6 +1077,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
        unsigned long date;
        unsigned char logged_sha1[20];
        void *log_mapped;
+       size_t mapsz;
 
        logfile = git_path("logs/%s", ref);
        logfd = open(logfile, O_RDONLY, 0);
@@ -1083,7 +1086,8 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
        fstat(logfd, &st);
        if (!st.st_size)
                die("Log %s is empty.", logfile);
-       log_mapped = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, logfd, 0);
+       mapsz = xsize_t(st.st_size);
+       log_mapped = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, logfd, 0);
        logdata = log_mapped;
        close(logfd);
 
@@ -1136,7 +1140,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
                                                logfile, show_rfc2822_date(date, tz));
                                }
                        }
-                       munmap(log_mapped, st.st_size);
+                       munmap(log_mapped, mapsz);
                        return 0;
                }
                lastrec = rec;
@@ -1155,7 +1159,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
                die("Log %s is corrupt.", logfile);
        if (msg)
                *msg = ref_msg(logdata, logend);
-       munmap(log_mapped, st.st_size);
+       munmap(log_mapped, mapsz);
 
        if (cutoff_time)
                *cutoff_time = date;
diff --git a/setup.c b/setup.c
index dda67d268dcacce2293d245395a38106860fb881..a45ea8309a9773160597f142f1208a6129885499 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -216,7 +216,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
                die("Not a git repository: '%s'", gitdirenv);
        }
 
-       if (!getcwd(cwd, sizeof(cwd)) || cwd[0] != '/')
+       if (!getcwd(cwd, sizeof(cwd)-1) || cwd[0] != '/')
                die("Unable to read current working directory");
 
        offset = len = strlen(cwd);
index 6d0a72ed093d353a672129f7e460d0c1015212d7..7faa8bcd507f54a55cb9e2ac685654921475f995 100644 (file)
@@ -349,6 +349,7 @@ static void link_alt_odb_entries(const char *alt, const char *ep, int sep,
 static void read_info_alternates(const char * relative_base, int depth)
 {
        char *map;
+       size_t mapsz;
        struct stat st;
        char path[PATH_MAX];
        int fd;
@@ -361,12 +362,13 @@ static void read_info_alternates(const char * relative_base, int depth)
                close(fd);
                return;
        }
-       map = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+       mapsz = xsize_t(st.st_size);
+       map = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, fd, 0);
        close(fd);
 
-       link_alt_odb_entries(map, map + st.st_size, '\n', relative_base, depth);
+       link_alt_odb_entries(map, map + mapsz, '\n', relative_base, depth);
 
-       munmap(map, st.st_size);
+       munmap(map, mapsz);
 }
 
 void prepare_alt_odb(void)
@@ -430,13 +432,14 @@ void pack_report()
                pack_mapped, peak_pack_mapped);
 }
 
-static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
-                               void **idx_map_)
+static int check_packed_git_idx(const char *path,
+       unsigned long *idx_size_,
+       void **idx_map_)
 {
        void *idx_map;
        uint32_t *index;
-       unsigned long idx_size;
-       int nr, i;
+       size_t idx_size;
+       uint32_t nr, i;
        int fd = open(path, O_RDONLY);
        struct stat st;
        if (fd < 0)
@@ -445,7 +448,11 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
                close(fd);
                return -1;
        }
-       idx_size = st.st_size;
+       idx_size = xsize_t(st.st_size);
+       if (idx_size < 4 * 256 + 20 + 20) {
+               close(fd);
+               return error("index file %s is too small", path);
+       }
        idx_map = xmmap(NULL, idx_size, PROT_READ, MAP_PRIVATE, fd, 0);
        close(fd);
 
@@ -453,25 +460,25 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
        *idx_map_ = idx_map;
        *idx_size_ = idx_size;
 
-       /* check index map */
-       if (idx_size < 4*256 + 20 + 20)
-               return error("index file %s is too small", path);
-
        /* a future index format would start with this, as older git
         * binaries would fail the non-monotonic index check below.
         * give a nicer warning to the user if we can.
         */
-       if (index[0] == htonl(PACK_IDX_SIGNATURE))
+       if (index[0] == htonl(PACK_IDX_SIGNATURE)) {
+               munmap(idx_map, idx_size);
                return error("index file %s is a newer version"
                        " and is not supported by this binary"
                        " (try upgrading GIT to a newer version)",
                        path);
+       }
 
        nr = 0;
        for (i = 0; i < 256; i++) {
-               unsigned int n = ntohl(index[i]);
-               if (n < nr)
+               uint32_t n = ntohl(index[i]);
+               if (n < nr) {
+                       munmap(idx_map, idx_size);
                        return error("non-monotonic index %s", path);
+               }
                nr = n;
        }
 
@@ -482,8 +489,10 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
         *  - 20-byte SHA1 of the packfile
         *  - 20-byte SHA1 file checksum
         */
-       if (idx_size != 4*256 + nr * 24 + 20 + 20)
+       if (idx_size != 4*256 + nr * 24 + 20 + 20) {
+               munmap(idx_map, idx_size);
                return error("wrong index file size in %s", path);
+       }
 
        return 0;
 }
@@ -622,7 +631,7 @@ static int open_packed_git(struct packed_git *p)
        return -1;
 }
 
-static int in_window(struct pack_window *win, unsigned long offset)
+static int in_window(struct pack_window *win, off_t offset)
 {
        /* We must promise at least 20 bytes (one hash) after the
         * offset is available from this window, otherwise the offset
@@ -637,7 +646,7 @@ static int in_window(struct pack_window *win, unsigned long offset)
 
 unsigned char* use_pack(struct packed_git *p,
                struct pack_window **w_cursor,
-               unsigned long offset,
+               off_t offset,
                unsigned int *left)
 {
        struct pack_window *win = *w_cursor;
@@ -662,11 +671,13 @@ unsigned char* use_pack(struct packed_git *p,
                }
                if (!win) {
                        size_t window_align = packed_git_window_size / 2;
+                       off_t len;
                        win = xcalloc(1, sizeof(*win));
                        win->offset = (offset / window_align) * window_align;
-                       win->len = p->pack_size - win->offset;
-                       if (win->len > packed_git_window_size)
-                               win->len = packed_git_window_size;
+                       len = p->pack_size - win->offset;
+                       if (len > packed_git_window_size)
+                               len = packed_git_window_size;
+                       win->len = (size_t)len;
                        pack_mapped += win->len;
                        while (packed_git_limit < pack_mapped
                                && unuse_one_window(p))
@@ -695,7 +706,7 @@ unsigned char* use_pack(struct packed_git *p,
        }
        offset -= win->offset;
        if (left)
-               *left = win->len - offset;
+               *left = win->len - xsize_t(offset);
        return win->base + offset;
 }
 
@@ -871,9 +882,9 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
                 */
                sha1_file_open_flag = 0;
        }
-       map = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+       *size = xsize_t(st.st_size);
+       map = xmmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0);
        close(fd);
-       *size = st.st_size;
        return map;
 }
 
@@ -956,11 +967,12 @@ static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned lon
        return 0;
 }
 
-static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size)
+static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size, const unsigned char *sha1)
 {
        int bytes = strlen(buffer) + 1;
        unsigned char *buf = xmalloc(1+size);
        unsigned long n;
+       int status = Z_OK;
 
        n = stream->total_out - bytes;
        if (n > size)
@@ -970,12 +982,22 @@ static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size
        if (bytes < size) {
                stream->next_out = buf + bytes;
                stream->avail_out = size - bytes;
-               while (inflate(stream, Z_FINISH) == Z_OK)
-                       /* nothing */;
+               while (status == Z_OK)
+                       status = inflate(stream, Z_FINISH);
        }
        buf[size] = 0;
-       inflateEnd(stream);
-       return buf;
+       if ((status == Z_OK || status == Z_STREAM_END) && !stream->avail_in) {
+               inflateEnd(stream);
+               return buf;
+       }
+
+       if (status < 0)
+               error("corrupt loose object '%s'", sha1_to_hex(sha1));
+       else if (stream->avail_in)
+               error("garbage at end of loose object '%s'",
+                     sha1_to_hex(sha1));
+       free(buf);
+       return NULL;
 }
 
 /*
@@ -1029,7 +1051,7 @@ static int parse_sha1_header(const char *hdr, unsigned long *sizep)
        return *hdr ? -1 : type_from_string(type);
 }
 
-void * unpack_sha1_file(void *map, unsigned long mapsize, enum object_type *type, unsigned long *size)
+static void *unpack_sha1_file(void *map, unsigned long mapsize, enum object_type *type, unsigned long *size, const unsigned char *sha1)
 {
        int ret;
        z_stream stream;
@@ -1039,17 +1061,17 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, enum object_type *type
        if (ret < Z_OK || (*type = parse_sha1_header(hdr, size)) < 0)
                return NULL;
 
-       return unpack_sha1_rest(&stream, hdr, *size);
+       return unpack_sha1_rest(&stream, hdr, *size, sha1);
 }
 
-static unsigned long get_delta_base(struct packed_git *p,
+static off_t get_delta_base(struct packed_git *p,
                                    struct pack_window **w_curs,
-                                   unsigned long *curpos,
+                                   off_t *curpos,
                                    enum object_type type,
-                                   unsigned long delta_obj_offset)
+                                   off_t delta_obj_offset)
 {
        unsigned char *base_info = use_pack(p, w_curs, *curpos, NULL);
-       unsigned long base_offset;
+       off_t base_offset;
 
        /* use_pack() assured us we have [base_info, base_info + 20)
         * as a range that we can look at without walking off the
@@ -1085,17 +1107,17 @@ static unsigned long get_delta_base(struct packed_git *p,
 }
 
 /* forward declaration for a mutually recursive function */
-static int packed_object_info(struct packed_git *p, unsigned long offset,
+static int packed_object_info(struct packed_git *p, off_t offset,
                              unsigned long *sizep);
 
 static int packed_delta_info(struct packed_git *p,
                             struct pack_window **w_curs,
-                            unsigned long curpos,
+                            off_t curpos,
                             enum object_type type,
-                            unsigned long obj_offset,
+                            off_t obj_offset,
                             unsigned long *sizep)
 {
-       unsigned long base_offset;
+       off_t base_offset;
 
        base_offset = get_delta_base(p, w_curs, &curpos, type, obj_offset);
        type = packed_object_info(p, base_offset, NULL);
@@ -1145,7 +1167,7 @@ static int packed_delta_info(struct packed_git *p,
 
 static int unpack_object_header(struct packed_git *p,
                                struct pack_window **w_curs,
-                               unsigned long *curpos,
+                               off_t *curpos,
                                unsigned long *sizep)
 {
        unsigned char *base;
@@ -1169,14 +1191,15 @@ static int unpack_object_header(struct packed_git *p,
 }
 
 const char *packed_object_info_detail(struct packed_git *p,
-                                     unsigned long obj_offset,
+                                     off_t obj_offset,
                                      unsigned long *size,
                                      unsigned long *store_size,
                                      unsigned int *delta_chain_length,
                                      unsigned char *base_sha1)
 {
        struct pack_window *w_curs = NULL;
-       unsigned long curpos, dummy;
+       off_t curpos;
+       unsigned long dummy;
        unsigned char *next_sha1;
        enum object_type type;
 
@@ -1200,6 +1223,7 @@ const char *packed_object_info_detail(struct packed_git *p,
                        obj_offset = get_delta_base(p, &w_curs, &curpos, type, obj_offset);
                        if (*delta_chain_length == 0) {
                                /* TODO: find base_sha1 as pointed by curpos */
+                               hashclr(base_sha1);
                        }
                        break;
                case OBJ_REF_DELTA:
@@ -1215,11 +1239,12 @@ const char *packed_object_info_detail(struct packed_git *p,
        }
 }
 
-static int packed_object_info(struct packed_git *p, unsigned long obj_offset,
+static int packed_object_info(struct packed_git *p, off_t obj_offset,
                              unsigned long *sizep)
 {
        struct pack_window *w_curs = NULL;
-       unsigned long size, curpos = obj_offset;
+       unsigned long size;
+       off_t curpos = obj_offset;
        enum object_type type;
 
        type = unpack_object_header(p, &w_curs, &curpos, &size);
@@ -1247,7 +1272,7 @@ static int packed_object_info(struct packed_git *p, unsigned long obj_offset,
 
 static void *unpack_compressed_entry(struct packed_git *p,
                                    struct pack_window **w_curs,
-                                   unsigned long curpos,
+                                   off_t curpos,
                                    unsigned long size)
 {
        int st;
@@ -1278,20 +1303,22 @@ static void *unpack_compressed_entry(struct packed_git *p,
 
 static void *unpack_delta_entry(struct packed_git *p,
                                struct pack_window **w_curs,
-                               unsigned long curpos,
+                               off_t curpos,
                                unsigned long delta_size,
-                               unsigned long obj_offset,
+                               off_t obj_offset,
                                enum object_type *type,
                                unsigned long *sizep)
 {
        void *delta_data, *result, *base;
-       unsigned long base_size, base_offset;
+       unsigned long base_size;
+       off_t base_offset;
 
        base_offset = get_delta_base(p, w_curs, &curpos, *type, obj_offset);
        base = unpack_entry(p, base_offset, type, &base_size);
        if (!base)
-               die("failed to read delta base object at %lu from %s",
-                   base_offset, p->pack_name);
+               die("failed to read delta base object"
+                   " at %"PRIuMAX" from %s",
+                   (uintmax_t)base_offset, p->pack_name);
 
        delta_data = unpack_compressed_entry(p, w_curs, curpos, delta_size);
        result = patch_delta(base, base_size,
@@ -1304,11 +1331,11 @@ static void *unpack_delta_entry(struct packed_git *p,
        return result;
 }
 
-void *unpack_entry(struct packed_git *p, unsigned long obj_offset,
+void *unpack_entry(struct packed_git *p, off_t obj_offset,
                   enum object_type *type, unsigned long *sizep)
 {
        struct pack_window *w_curs = NULL;
-       unsigned long curpos = obj_offset;
+       off_t curpos = obj_offset;
        void *data;
 
        *type = unpack_object_header(p, &w_curs, &curpos, sizep);
@@ -1331,23 +1358,23 @@ void *unpack_entry(struct packed_git *p, unsigned long obj_offset,
        return data;
 }
 
-int num_packed_objects(const struct packed_git *p)
+uint32_t num_packed_objects(const struct packed_git *p)
 {
        /* See check_packed_git_idx() */
-       return (p->index_size - 20 - 20 - 4*256) / 24;
+       return (uint32_t)((p->index_size - 20 - 20 - 4*256) / 24);
 }
 
-int nth_packed_object_sha1(const struct packed_git *p, int n,
+int nth_packed_object_sha1(const struct packed_git *p, uint32_t n,
                           unsigned char* sha1)
 {
        void *index = p->index_base + 256;
-       if (n < 0 || num_packed_objects(p) <= n)
+       if (num_packed_objects(p) <= n)
                return -1;
        hashcpy(sha1, (unsigned char *) index + (24 * n) + 4);
        return 0;
 }
 
-unsigned long find_pack_entry_one(const unsigned char *sha1,
+off_t find_pack_entry_one(const unsigned char *sha1,
                                  struct packed_git *p)
 {
        uint32_t *level1_ofs = p->index_base;
@@ -1389,7 +1416,7 @@ static int matches_pack_name(struct packed_git *p, const char *ig)
 static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e, const char **ignore_packed)
 {
        struct packed_git *p;
-       unsigned long offset;
+       off_t offset;
 
        prepare_packed_git();
 
@@ -1555,7 +1582,7 @@ void *read_sha1_file(const unsigned char *sha1, enum object_type *type,
                return buf;
        map = map_sha1_file(sha1, &mapsize);
        if (map) {
-               buf = unpack_sha1_file(map, mapsize, type, size);
+               buf = unpack_sha1_file(map, mapsize, type, size, sha1);
                munmap(map, mapsize);
                return buf;
        }
@@ -2056,11 +2083,10 @@ int index_pipe(unsigned char *sha1, int fd, const char *type, int write_object)
 int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object,
             enum object_type type, const char *path)
 {
-       unsigned long size = st->st_size;
-       void *buf;
+       size_t size = xsize_t(st->st_size);
+       void *buf = NULL;
        int ret, re_allocated = 0;
 
-       buf = "";
        if (size)
                buf = xmmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
        close(fd);
@@ -2100,6 +2126,7 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
 {
        int fd;
        char *target;
+       size_t len;
 
        switch (st->st_mode & S_IFMT) {
        case S_IFREG:
@@ -2112,16 +2139,17 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
                                     path);
                break;
        case S_IFLNK:
-               target = xmalloc(st->st_size+1);
-               if (readlink(path, target, st->st_size+1) != st->st_size) {
+               len = xsize_t(st->st_size);
+               target = xmalloc(len + 1);
+               if (readlink(path, target, len + 1) != st->st_size) {
                        char *errstr = strerror(errno);
                        free(target);
                        return error("readlink(\"%s\"): %s", path,
                                     errstr);
                }
                if (!write_object)
-                       hash_sha1_file(target, st->st_size, blob_type, sha1);
-               else if (write_sha1_file(target, st->st_size, blob_type, sha1))
+                       hash_sha1_file(target, len, blob_type, sha1);
+               else if (write_sha1_file(target, len, blob_type, sha1))
                        return error("%s: failed to insert into database",
                                     path);
                free(target);
index 0781477a71ac4d76a1b8783868d6649cae7f8507..31812d3d26c7b33eaf3fe76f3145fd1fc193366d 100644 (file)
@@ -76,10 +76,10 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne
 
        prepare_packed_git();
        for (p = packed_git; p && found < 2; p = p->next) {
-               unsigned num = num_packed_objects(p);
-               unsigned first = 0, last = num;
+               uint32_t num = num_packed_objects(p);
+               uint32_t first = 0, last = num;
                while (first < last) {
-                       unsigned mid = (first + last) / 2;
+                       uint32_t mid = (first + last) / 2;
                        unsigned char now[20];
                        int cmp;
 
index 87403da780814787f6c4ea15a790381a5b2395d3..cacb273afff1fbddf152bb440451fa141589cf33 100644 (file)
@@ -114,7 +114,8 @@ test_expect_success \
 test_expect_success \
     'some edit' \
     'mv file file.orig &&
-    sed -e "s/^3A/99/" -e "/^1A/d" < file.orig > file &&
+    sed -e "s/^3A/99/" -e "/^1A/d" -e "/^incomplete/d" < file.orig > file &&
+    echo "incomplete" | tr -d "\\012" >>file &&
     GIT_AUTHOR_NAME="D" git commit -a -m "edit"'
 
 test_expect_success \
index 745a1b03116a58f89cc9ac533f948fa91c795518..4624fe654c2515afe14e9e05402ac9ce78322772 100755 (executable)
@@ -11,7 +11,7 @@ compare_diff_raw () {
 
     sed -e "$sanitize_diff_raw" <"$1" >.tmp-1
     sed -e "$sanitize_diff_raw" <"$2" >.tmp-2
-    diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
+    git diff .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
 }
 
 sanitize_diff_raw_z='/^:/s/ '"$_x40"' '"$_x40"' \([A-Z]\)[0-9]*$/ X X \1#/'
@@ -23,7 +23,7 @@ compare_diff_raw_z () {
 
     tr '\0' '\012' <"$1" | sed -e "$sanitize_diff_raw_z" >.tmp-1
     tr '\0' '\012' <"$2" | sed -e "$sanitize_diff_raw_z" >.tmp-2
-    diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
+    git diff .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
 }
 
 compare_diff_patch () {
@@ -37,5 +37,5 @@ compare_diff_patch () {
        /^[dis]*imilarity index [0-9]*%$/d
        /^index [0-9a-f]*\.\.[0-9a-f]/d
     ' <"$2" >.tmp-2
-    diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
+    git diff .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
 }
index d0af8c3d52573fea203aab13612a9103cca78dd9..e26a36cf0f4c113d916c2d23daf036e4844be053 100755 (executable)
@@ -131,7 +131,7 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 
 check_result () {
     git-ls-files --stage | sed -e 's/ '"$_x40"' / X /' >current &&
-    diff -u expected current
+    git diff expected current
 }
 
 # This is done on an empty work directory, which is the normal
index 75e4c9a88657e4ea28e0b4dfb7cbb2c3eaaa2f3f..030226bbfbd764a21aa59577b365868237d4f40b 100755 (executable)
@@ -33,7 +33,7 @@ compare_change () {
            -e '/^--- /d; /^+++ /d; /^@@ /d;' \
            -e 's/^\([-+][0-7][0-7][0-7][0-7][0-7][0-7]\) '"$_x40"' /\1 X /p' \
            "$1"
-       diff -u expected current
+       git diff expected current
 }
 
 check_cache_at () {
@@ -86,7 +86,7 @@ test_expect_success \
     'rm -f .git/index &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >1-3.out &&
-     diff -u M.out 1-3.out &&
+     git diff M.out 1-3.out &&
      check_cache_at bozbar dirty &&
      check_cache_at frotz dirty &&
      check_cache_at nitfol dirty'
@@ -101,7 +101,7 @@ test_expect_success \
      git-update-index --add yomin &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >4.out || return 1
-     diff -u M.out 4.out >4diff.out
+     git diff M.out 4.out >4diff.out
      compare_change 4diff.out expected &&
      check_cache_at yomin clean'
 
@@ -115,7 +115,7 @@ test_expect_success \
      echo yomin yomin >yomin &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >5.out || return 1
-     diff -u M.out 5.out >5diff.out
+     git diff M.out 5.out >5diff.out
      compare_change 5diff.out expected &&
      check_cache_at yomin dirty'
 
@@ -127,7 +127,7 @@ test_expect_success \
      git-update-index --add frotz &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >6.out &&
-     diff -u M.out 6.out &&
+     git diff M.out 6.out &&
      check_cache_at frotz clean'
 
 test_expect_success \
@@ -140,7 +140,7 @@ test_expect_success \
      echo frotz frotz >frotz &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >7.out &&
-     diff -u M.out 7.out &&
+     git diff M.out 7.out &&
      check_cache_at frotz dirty'
 
 test_expect_success \
@@ -171,7 +171,7 @@ test_expect_success \
      git-update-index --add rezrov &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >10.out &&
-     diff -u M.out 10.out'
+     git diff M.out 10.out'
 
 test_expect_success \
     '11 - dirty path removed.' \
@@ -216,7 +216,7 @@ test_expect_success \
      git-update-index --add nitfol &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >14.out || return 1
-     diff -u M.out 14.out >14diff.out
+     git diff M.out 14.out >14diff.out
      compare_change 14diff.out expected &&
      check_cache_at nitfol clean'
 
@@ -230,7 +230,7 @@ test_expect_success \
      echo nitfol nitfol nitfol >nitfol &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >15.out || return 1
-     diff -u M.out 15.out >15diff.out
+     git diff M.out 15.out >15diff.out
      compare_change 15diff.out expected &&
      check_cache_at nitfol dirty'
 
@@ -262,7 +262,7 @@ test_expect_success \
      git-update-index --add bozbar &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >18.out &&
-     diff -u M.out 18.out &&
+     git diff M.out 18.out &&
      check_cache_at bozbar clean'
 
 test_expect_success \
@@ -275,7 +275,7 @@ test_expect_success \
      echo gnusto gnusto >bozbar &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >19.out &&
-     diff -u M.out 19.out &&
+     git diff M.out 19.out &&
      check_cache_at bozbar dirty'
 
 test_expect_success \
@@ -287,7 +287,7 @@ test_expect_success \
      git-update-index --add bozbar &&
      read_tree_twoway $treeH $treeM &&
      git-ls-files --stage >20.out &&
-     diff -u M.out 20.out &&
+     git diff M.out 20.out &&
      check_cache_at bozbar dirty'
 
 test_expect_success \
@@ -337,7 +337,7 @@ test_expect_success \
      git-update-index --add DF &&
      read_tree_twoway $treeDF $treeDFDF &&
      git-ls-files --stage >DFDFcheck.out &&
-     diff -u DFDF.out DFDFcheck.out &&
+     git diff DFDF.out DFDFcheck.out &&
      check_cache_at DF/DF dirty &&
      :'
 
index da3c81357b8ffee7d6fc3f2d4301e9c3c9d076fd..87fe993f59e2b3843ea2abcd92a2bab77a392997 100755 (executable)
@@ -16,7 +16,7 @@ compare_change () {
        sed >current \
            -e '/^--- /d; /^+++ /d; /^@@ /d;' \
            -e 's/^\(.[0-7][0-7][0-7][0-7][0-7][0-7]\) '"$_x40"' /\1 X /' "$1"
-       diff -u expected current
+       git diff expected current
 }
 
 check_cache_at () {
index 49b5666b33283feaf8ea2b7c09faeab8016c746d..78c2e0864f56ecf39e8738e8fecec9ca8dd4e8a2 100755 (executable)
@@ -368,12 +368,12 @@ cat > expect << EOF
 weird
 EOF
 
-test_expect_success "rename succeeded" "diff -u expect .git/config"
+test_expect_success "rename succeeded" "git diff expect .git/config"
 
 test_expect_failure "rename non-existing section" \
        'git-config --rename-section branch."world domination" branch.drei'
 
-test_expect_success "rename succeeded" "diff -u expect .git/config"
+test_expect_success "rename succeeded" "git diff expect .git/config"
 
 test_expect_success "rename another section" \
        'git-config --rename-section branch."1 234 blabl/a" branch.drei'
@@ -389,7 +389,23 @@ cat > expect << EOF
 weird
 EOF
 
-test_expect_success "rename succeeded" "diff -u expect .git/config"
+test_expect_success "rename succeeded" "git diff expect .git/config"
+
+cat >> .git/config << EOF
+  [branch "zwei"] a = 1 [branch "vier"]
+EOF
+
+test_expect_success "remove section" "git config --remove-section branch.zwei"
+
+cat > expect << EOF
+# Hallo
+       #Bello
+[branch "drei"]
+weird
+EOF
+
+test_expect_success "section was removed properly" \
+       "git diff -u expect .git/config"
 
 test_expect_success numbers '
 
index 6979b7c1c05001d08ce94f9034580f94745b4924..db7a847a5dd13ece7a4ec22d795b8407631d7d4c 100755 (executable)
@@ -65,7 +65,7 @@ test_expect_success \
        --exclude-per-directory=.gitignore \
        --exclude-from=.git/ignore \
        >output &&
-     diff -u expect output'
+     git diff expect output'
 
 # Test \r\n (MSDOS-like systems)
 printf '*.1\r\n/*.3\r\n!*.6\r\n' >.gitignore
@@ -77,6 +77,6 @@ test_expect_success \
        --exclude-per-directory=.gitignore \
        --exclude-from=.git/ignore \
        >output &&
-     diff -u expect output'
+     git diff expect output'
 
 test_done
index b42f1382bc9c585d12febcd99594f6ba7d7d743c..cc8967d76b10e18eb6b7db69fbb31baf702f2efc 100755 (executable)
@@ -23,7 +23,7 @@ test_expect_success \
 test_expect_success \
     'git-ls-files without path restriction.' \
     'git-ls-files --others >output &&
-     diff -u output - <<EOF
+     git diff output - <<EOF
 --
 -foo
 output
@@ -34,7 +34,7 @@ EOF
 test_expect_success \
     'git-ls-files with path restriction.' \
     'git-ls-files --others path0 >output &&
-       diff -u output - <<EOF
+       git diff output - <<EOF
 path0
 EOF
 '
@@ -42,7 +42,7 @@ EOF
 test_expect_success \
     'git-ls-files with path restriction with --.' \
     'git-ls-files --others -- path0 >output &&
-       diff -u output - <<EOF
+       git diff output - <<EOF
 path0
 EOF
 '
@@ -50,7 +50,7 @@ EOF
 test_expect_success \
     'git-ls-files with path restriction with -- --.' \
     'git-ls-files --others -- -- >output &&
-       diff -u output - <<EOF
+       git diff output - <<EOF
 --
 EOF
 '
@@ -58,7 +58,7 @@ EOF
 test_expect_success \
     'git-ls-files with no path restriction.' \
     'git-ls-files --others -- >output &&
-       diff -u output - <<EOF
+       git diff output - <<EOF
 --
 -foo
 output
index 2ec06d3d3979aad18b4594329e93407d33f8cae5..e10749245b454f4c71486e536049cbf5b09259d5 100755 (executable)
@@ -35,7 +35,7 @@ _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 test_output () {
     sed -e "s/ $_x40   / X     /" <current >check
-    diff -u expected check
+    git diff expected check
 }
 
 test_expect_success \
index d78deb1e710056e236ba61f4b8ceb55e11c44cbf..087929a4bfdf053124f81af3bfb73ab1e9e1709a 100755 (executable)
@@ -43,7 +43,7 @@ _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 test_output () {
     sed -e "s/ $_x40   / X     /" <current >check
-    diff -u expected check
+    git diff expected check
 }
 
 test_expect_success \
index c12270efab80e715e50440a0ae6d05555b055481..b5a1400e18b0fa5190fde4d0b60d1563581b2a19 100755 (executable)
@@ -35,7 +35,7 @@ no-funny' >expected
 test_expect_success 'git-ls-files no-funny' \
        'git-update-index --add "$p0" "$p2" &&
        git-ls-files >current &&
-       diff -u expected current'
+       git diff expected current'
 
 t0=`git-write-tree`
 echo "$t0" >t0
@@ -48,14 +48,14 @@ EOF
 test_expect_success 'git-ls-files with-funny' \
        'git-update-index --add "$p1" &&
        git-ls-files >current &&
-       diff -u expected current'
+       git diff expected current'
 
 echo 'just space
 no-funny
 tabs   ," (dq) and spaces' >expected
 test_expect_success 'git-ls-files -z with-funny' \
        'git-ls-files -z | tr \\0 \\012 >current &&
-       diff -u expected current'
+       git diff expected current'
 
 t1=`git-write-tree`
 echo "$t1" >t1
@@ -67,28 +67,28 @@ no-funny
 EOF
 test_expect_success 'git-ls-tree with funny' \
        'git-ls-tree -r $t1 | sed -e "s/^[^     ]*      //" >current &&
-        diff -u expected current'
+        git diff expected current'
 
 cat > expected <<\EOF
 A      "tabs\t,\" (dq) and spaces"
 EOF
 test_expect_success 'git-diff-index with-funny' \
        'git-diff-index --name-status $t0 >current &&
-       diff -u expected current'
+       git diff expected current'
 
 test_expect_success 'git-diff-tree with-funny' \
        'git-diff-tree --name-status $t0 $t1 >current &&
-       diff -u expected current'
+       git diff expected current'
 
 echo 'A
 tabs   ," (dq) and spaces' >expected
 test_expect_success 'git-diff-index -z with-funny' \
        'git-diff-index -z --name-status $t0 | tr \\0 \\012 >current &&
-       diff -u expected current'
+       git diff expected current'
 
 test_expect_success 'git-diff-tree -z with-funny' \
        'git-diff-tree -z --name-status $t0 $t1 | tr \\0 \\012 >current &&
-       diff -u expected current'
+       git diff expected current'
 
 cat > expected <<\EOF
 CNUM   no-funny        "tabs\t,\" (dq) and spaces"
@@ -96,7 +96,7 @@ EOF
 test_expect_success 'git-diff-tree -C with-funny' \
        'git-diff-tree -C --find-copies-harder --name-status \
                $t0 $t1 | sed -e 's/^C[0-9]*/CNUM/' >current &&
-       diff -u expected current'
+       git diff expected current'
 
 cat > expected <<\EOF
 RNUM   no-funny        "tabs\t,\" (dq) and spaces"
@@ -105,7 +105,7 @@ test_expect_success 'git-diff-tree delete with-funny' \
        'git-update-index --force-remove "$p0" &&
        git-diff-index -M --name-status \
                $t0 | sed -e 's/^R[0-9]*/RNUM/' >current &&
-       diff -u expected current'
+       git diff expected current'
 
 cat > expected <<\EOF
 diff --git a/no-funny "b/tabs\t,\" (dq) and spaces"
@@ -116,7 +116,7 @@ EOF
 test_expect_success 'git-diff-tree delete with-funny' \
        'git-diff-index -M -p $t0 |
         sed -e "s/index [0-9]*%/index NUM%/" >current &&
-        diff -u expected current'
+        git diff expected current'
 
 chmod +x "$p1"
 cat > expected <<\EOF
@@ -130,7 +130,7 @@ EOF
 test_expect_success 'git-diff-tree delete with-funny' \
        'git-diff-index -M -p $t0 |
         sed -e "s/index [0-9]*%/index NUM%/" >current &&
-        diff -u expected current'
+        git diff expected current'
 
 cat >expected <<\EOF
  "tabs\t,\" (dq) and spaces"
@@ -139,7 +139,7 @@ EOF
 test_expect_success 'git-diff-tree rename with-funny applied' \
        'git-diff-index -M -p $t0 |
         git-apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current &&
-        diff -u expected current'
+        git diff expected current'
 
 cat > expected <<\EOF
  no-funny
@@ -149,12 +149,12 @@ EOF
 test_expect_success 'git-diff-tree delete with-funny applied' \
        'git-diff-index -p $t0 |
         git-apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current &&
-        diff -u expected current'
+        git diff expected current'
 
 test_expect_success 'git-apply non-git diff' \
        'git-diff-index -p $t0 |
         sed -ne "/^[-+@]/p" |
         git-apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current &&
-        diff -u expected current'
+        git diff expected current'
 
 test_done
index e54fe0f4014d435f7d2da325bef3d7602a584d42..ffddb68db3abbf1ab14bf99f3c9514a7ee0c276b 100755 (executable)
@@ -9,7 +9,7 @@ test_description='commit and log output encodings'
 
 compare_with () {
        git-show -s $1 | sed -e '1,/^$/d' -e 's/^    //' -e '$d' >current &&
-       diff -u current "$2"
+       git diff current "$2"
 }
 
 test_expect_success setup '
index ca342f48a198c2e98e4459273e8350bb7aed6328..e72c6fd1b4fa294e3e52fe55ab68c672bfc57e15 100755 (executable)
@@ -38,7 +38,7 @@ echo ":100644 100755 X X M    rezrov" >expected
 
 test_expect_success \
     'verify' \
-    'diff -u expected check'
+    'git diff expected check'
 
 test_done
 
index 8345ef5bf76cbf9ce2cebd962fa36c1f7ce445da..488e075c16611e5e6132744939574cdd878c3959 100755 (executable)
@@ -111,7 +111,7 @@ do
                } >"$actual" &&
                if test -f "$expect"
                then
-                       diff -u "$expect" "$actual" &&
+                       git diff "$expect" "$actual" &&
                        rm -f "$actual"
                else
                        # this is to help developing new tests.
index adf4993bacf05b4ccb0b447910dda6a2c453bc83..930e209d3136c855c3257e81d889e4dcf765595a 100755 (executable)
@@ -43,13 +43,13 @@ index adf3937..6edc172 100644
 EOF
 
 git-diff > out
-test_expect_success "Ray's example without options" 'diff -u expect out'
+test_expect_success "Ray's example without options" 'git diff expect out'
 
 git-diff -w > out
-test_expect_success "Ray's example with -w" 'diff -u expect out'
+test_expect_success "Ray's example with -w" 'git diff expect out'
 
 git-diff -b > out
-test_expect_success "Ray's example with -b" 'diff -u expect out'
+test_expect_success "Ray's example with -b" 'git diff expect out'
 
 tr 'Q' '\015' << EOF > x
 whitespace at beginning
@@ -90,14 +90,14 @@ index d99af23..8b32fb5 100644
 +CR at end
 EOF
 git-diff > out
-test_expect_success 'another test, without options' 'diff -u expect out'
+test_expect_success 'another test, without options' 'git diff expect out'
 
 cat << EOF > expect
 diff --git a/x b/x
 index d99af23..8b32fb5 100644
 EOF
 git-diff -w > out
-test_expect_success 'another test, with -w' 'diff -u expect out'
+test_expect_success 'another test, with -w' 'git diff expect out'
 
 tr 'Q' '\015' << EOF > expect
 diff --git a/x b/x
@@ -115,6 +115,6 @@ index d99af23..8b32fb5 100644
  CR at endQ
 EOF
 git-diff -b > out
-test_expect_success 'another test, with -b' 'diff -u expect out'
+test_expect_success 'another test, with -b' 'git diff expect out'
 
 test_done
index 2e7cd5f255ce01e0143963aa69e24a4f33ea8325..5dbdc0c9faf81ea95939fec0c285b2020e07a8d9 100755 (executable)
@@ -49,7 +49,7 @@ cat >expect <<\EOF
 EOF
 test_expect_success 'git diff --summary -M HEAD' '
        git diff --summary -M HEAD >actual &&
-       diff -u expect actual
+       git diff expect actual
 '
 
 cat >expect <<\EOF
@@ -64,7 +64,7 @@ cat >expect <<\EOF
 EOF
 test_expect_success 'git diff --stat -M HEAD' '
        git diff --stat -M HEAD >actual &&
-       diff -u expect actual
+       git diff expect actual
 '
 
 test_done
index 6579f06b05c91f00f4f45015894f2bfab1076bf6..7b81c32e57f502f2c6d952bd9b7e6b432e092372 100755 (executable)
@@ -11,37 +11,37 @@ test_description='git-apply --stat --summary test.
 test_expect_success \
     'rename' \
     'git-apply --stat --summary <../t4100/t-apply-1.patch >current &&
-    diff -u ../t4100/t-apply-1.expect current'
+    git diff ../t4100/t-apply-1.expect current'
 
 test_expect_success \
     'copy' \
     'git-apply --stat --summary <../t4100/t-apply-2.patch >current &&
-    diff -u ../t4100/t-apply-2.expect current'
+    git diff ../t4100/t-apply-2.expect current'
 
 test_expect_success \
     'rewrite' \
     'git-apply --stat --summary <../t4100/t-apply-3.patch >current &&
-    diff -u ../t4100/t-apply-3.expect current'
+    git diff ../t4100/t-apply-3.expect current'
 
 test_expect_success \
     'mode' \
     'git-apply --stat --summary <../t4100/t-apply-4.patch >current &&
-    diff -u ../t4100/t-apply-4.expect current'
+    git diff ../t4100/t-apply-4.expect current'
 
 test_expect_success \
     'non git' \
     'git-apply --stat --summary <../t4100/t-apply-5.patch >current &&
-    diff -u ../t4100/t-apply-5.expect current'
+    git diff ../t4100/t-apply-5.expect current'
 
 test_expect_success \
     'non git' \
     'git-apply --stat --summary <../t4100/t-apply-6.patch >current &&
-    diff -u ../t4100/t-apply-6.expect current'
+    git diff ../t4100/t-apply-6.expect current'
 
 test_expect_success \
     'non git' \
     'git-apply --stat --summary <../t4100/t-apply-7.patch >current &&
-    diff -u ../t4100/t-apply-7.expect current'
+    git diff ../t4100/t-apply-7.expect current'
 
 test_done
 
index 2ff800c23f8f833393c9eb7f50c89bd1a790094f..a5fb3ea40e4fde9126e66ed46fd3fc337b40ff66 100755 (executable)
@@ -90,7 +90,7 @@ do
                                cat '"$kind-patch.$with"'
                                (exit 1)
                        } &&
-                       diff -u '"$kind"'-expect victim
+                       git diff '"$kind"'-expect victim
                '
        done
 done
@@ -108,7 +108,7 @@ do
                        cat '"$kind-ng.without"'
                        (exit 1)
                } &&
-               diff -u '"$kind"'-expect victim
+               git diff '"$kind"'-expect victim
        '
 done
 
index d5f2cfb186110160df47a450e2f76206b85ee51b..b947ed83bb1b1d61690df1140ede337b15cb04ed 100755 (executable)
@@ -33,7 +33,7 @@ test_expect_success 'apply symlink patch' '
        git checkout side &&
        git apply patch &&
        git diff-files -p >patched &&
-       diff -u patch patched
+       git diff patch patched
 
 '
 
@@ -42,7 +42,7 @@ test_expect_success 'apply --index symlink patch' '
        git checkout -f side &&
        git apply --index patch &&
        git diff-index --cached -p HEAD >patched &&
-       diff -u patch patched
+       git diff patch patched
 
 '
 
index aa2c869e0e7ffcfba2e4349cf5af0e2badcb5516..2685b2263017df96159542853b373ea261880ba4 100755 (executable)
@@ -42,7 +42,7 @@ test_expect_success 'apply in reverse' '
        git reset --hard second &&
        git apply --reverse --binary --index patch &&
        git diff >diff &&
-       diff -u /dev/null diff
+       git diff /dev/null diff
 
 '
 
index b4de075a3e5df86fe399f9133f7437c4a8d8e26d..91931f0e3fde4874c865aa8dd44615b415d324ee 100755 (executable)
@@ -54,7 +54,7 @@ test_expect_success 'apply without --reject should fail' '
                exit 1
        fi
 
-       diff -u file1 saved.file1
+       git diff file1 saved.file1
 '
 
 test_expect_success 'apply without --reject should fail' '
@@ -65,7 +65,7 @@ test_expect_success 'apply without --reject should fail' '
                exit 1
        fi
 
-       diff -u file1 saved.file1
+       git diff file1 saved.file1
 '
 
 test_expect_success 'apply with --reject should fail but update the file' '
@@ -79,7 +79,7 @@ test_expect_success 'apply with --reject should fail but update the file' '
                exit 1
        fi
 
-       diff -u file1 expected &&
+       git diff file1 expected &&
 
        cat file1.rej &&
 
@@ -105,7 +105,7 @@ test_expect_success 'apply with --reject should fail but update the file' '
                echo "file1 still exists?"
                exit 1
        }
-       diff -u file2 expected &&
+       git diff file2 expected &&
 
        cat file2.rej &&
 
@@ -132,7 +132,7 @@ test_expect_success 'the same test with --verbose' '
                echo "file1 still exists?"
                exit 1
        }
-       diff -u file2 expected &&
+       git diff file2 expected &&
 
        cat file2.rej &&
 
@@ -151,7 +151,7 @@ test_expect_success 'apply cleanly with --verbose' '
 
        git apply --verbose patch.1 &&
 
-       diff -u file1 clean
+       git diff file1 clean
 '
 
 test_done
index 7309422fe520ee5f459713da85b255233c0de9a5..690a1820032025056307de8926e8f56826c29367 100755 (executable)
@@ -37,7 +37,7 @@ test_expect_success 'apply --numstat' '
                echo "0 1       file1" &&
                echo "0 1       file2"
        } >expect &&
-       diff -u expect actual
+       git diff expect actual
 
 '
 
@@ -47,8 +47,8 @@ test_expect_success 'apply --apply' '
        cat file2.orig >file2 &&
        git update-index file1 file2 &&
        git apply --index diff.output &&
-       diff -u file1.mods file1 &&
-       diff -u file2.mods file2
+       git diff file1.mods file1 &&
+       git diff file2.mods file2
 '
 
 test_done
index 639d45fcec2ce80a225da4d73696cea5af3a9de3..e081b32aff393c4ea6d2e12e3d69d2217d6ef378 100755 (executable)
@@ -70,7 +70,7 @@ EOF
 
 git rerere diff > out
 
-test_expect_success 'rerere diff' 'diff -u expect out'
+test_expect_success 'rerere diff' 'git diff expect out'
 
 cat > expect << EOF
 a1
@@ -78,7 +78,7 @@ EOF
 
 git rerere status > out
 
-test_expect_success 'rerere status' 'diff -u expect out'
+test_expect_success 'rerere status' 'git diff expect out'
 
 test_expect_success 'commit succeeds' \
        "git commit -q -a -m 'prefer first over second'"
@@ -94,7 +94,7 @@ test_expect_failure 'another conflicting merge' 'git pull . first'
 git show first:a1 | sed 's/To die: t/To die! T/' > expect
 test_expect_success 'rerere kicked in' "! grep ======= a1"
 
-test_expect_success 'rerere prefers first change' 'diff -u a1 expect'
+test_expect_success 'rerere prefers first change' 'git diff a1 expect'
 
 rm $rr/postimage
 echo "$sha1    a1" | tr '\012' '\0' > .git/rr-cache/MERGE_RR
index 7d93d0d7c90de94b0972d8fa5cd6d747c3fd2f56..477b267599512fee5a5a3cf86687c3708ff967b8 100755 (executable)
@@ -108,9 +108,9 @@ test_expect_success \
        cd victim &&
        git-config receive.denyNonFastforwards true &&
        cd .. &&
-       git-update-ref refs/heads/master master^ &&
-       git-send-pack --force ./victim/.git/ master &&
-       ! diff -u .git/refs/heads/master victim/.git/refs/heads/master
+       git-update-ref refs/heads/master master^ || return 1
+       git-send-pack --force ./victim/.git/ master && return 1
+       ! git diff .git/refs/heads/master victim/.git/refs/heads/master
 '
 
 test_done
index 0514056ca6e8e54101b378cafd76b22a81df0ff5..cf6306ce9f4050e65f7e2cd69f5d5e68b04fb12d 100755 (executable)
@@ -11,71 +11,124 @@ test_expect_success setup '
        git-update-index --add a &&
        tree0=$(git-write-tree) &&
        commit0=$(echo setup | git-commit-tree $tree0) &&
-       git-update-ref HEAD $commit0 &&
-       git-clone ./. victim &&
        echo We hope it works. >a &&
        git-update-index a &&
        tree1=$(git-write-tree) &&
        commit1=$(echo modify | git-commit-tree $tree1 -p $commit0) &&
-       git-update-ref HEAD $commit1
+       git-update-ref refs/heads/master $commit0 &&
+       git-update-ref refs/heads/tofail $commit1 &&
+       git-clone ./. victim &&
+       GIT_DIR=victim/.git git-update-ref refs/heads/tofail $commit1 &&
+       git-update-ref refs/heads/master $commit1 &&
+       git-update-ref refs/heads/tofail $commit0
 '
 
+cat >victim/.git/hooks/pre-receive <<'EOF'
+#!/bin/sh
+echo "$@" >>$GIT_DIR/pre-receive.args
+read x; printf "$x" >$GIT_DIR/pre-receive.stdin
+echo STDOUT pre-receive
+echo STDERR pre-receive >&2
+EOF
+chmod u+x victim/.git/hooks/pre-receive
+
 cat >victim/.git/hooks/update <<'EOF'
 #!/bin/sh
-echo "$@" >$GIT_DIR/update.args
+echo "$@" >>$GIT_DIR/update.args
 read x; printf "$x" >$GIT_DIR/update.stdin
-echo STDOUT update
-echo STDERR update >&2
+echo STDOUT update $1
+echo STDERR update $1 >&2
+test "$1" = refs/heads/master || exit
 EOF
 chmod u+x victim/.git/hooks/update
 
+cat >victim/.git/hooks/post-receive <<'EOF'
+#!/bin/sh
+echo "$@" >>$GIT_DIR/post-receive.args
+read x; printf "$x" >$GIT_DIR/post-receive.stdin
+echo STDOUT post-receive
+echo STDERR post-receive >&2
+EOF
+chmod u+x victim/.git/hooks/post-receive
+
 cat >victim/.git/hooks/post-update <<'EOF'
 #!/bin/sh
-echo "$@" >$GIT_DIR/post-update.args
+echo "$@" >>$GIT_DIR/post-update.args
 read x; printf "$x" >$GIT_DIR/post-update.stdin
 echo STDOUT post-update
 echo STDERR post-update >&2
 EOF
 chmod u+x victim/.git/hooks/post-update
 
-test_expect_success push '
-       git-send-pack ./victim/.git/ master >send.out 2>send.err
+test_expect_failure push '
+       git-send-pack --force ./victim/.git master tofail >send.out 2>send.err
+'
+
+test_expect_success 'updated as expected' '
+       test $(GIT_DIR=victim/.git git-rev-parse master) = $commit1 &&
+       test $(GIT_DIR=victim/.git git-rev-parse tofail) = $commit1
 '
 
 test_expect_success 'hooks ran' '
+       test -f victim/.git/pre-receive.args &&
+       test -f victim/.git/pre-receive.stdin &&
        test -f victim/.git/update.args &&
        test -f victim/.git/update.stdin &&
+       test -f victim/.git/post-receive.args &&
+       test -f victim/.git/post-receive.stdin &&
        test -f victim/.git/post-update.args &&
        test -f victim/.git/post-update.stdin
 '
 
+test_expect_success 'pre-receive hook arguments' '
+       echo \
+        refs/heads/master $commit0 $commit1 \
+        refs/heads/tofail $commit1 $commit0 \
+       | git diff - victim/.git/pre-receive.args
+'
+
 test_expect_success 'update hook arguments' '
+       (echo refs/heads/master $commit0 $commit1;
+        echo refs/heads/tofail $commit1 $commit0
+       ) | git diff - victim/.git/update.args
+'
+
+test_expect_success 'post-receive hook arguments' '
        echo refs/heads/master $commit0 $commit1 |
-       diff -u - victim/.git/update.args
+       git diff - victim/.git/post-receive.args
 '
 
 test_expect_success 'post-update hook arguments' '
        echo refs/heads/master |
-       diff -u - victim/.git/post-update.args
-'
-
-test_expect_failure 'update hook stdin is /dev/null' '
-       test -s victim/.git/update.stdin
+       git diff - victim/.git/post-update.args
 '
 
-test_expect_failure 'post-update hook stdin is /dev/null' '
-       test -s victim/.git/post-update.stdin
+test_expect_success 'all hook stdin is /dev/null' '
+       ! test -s victim/.git/pre-receive.stdin &&
+       ! test -s victim/.git/update.stdin &&
+       ! test -s victim/.git/post-receive.stdin &&
+       ! test -s victim/.git/post-update.stdin
 '
 
 test_expect_failure 'send-pack produced no output' '
        test -s send.out
 '
 
+cat <<EOF >expect
+STDOUT pre-receive
+STDERR pre-receive
+STDOUT update refs/heads/master
+STDERR update refs/heads/master
+STDOUT update refs/heads/tofail
+STDERR update refs/heads/tofail
+STDOUT post-receive
+STDERR post-receive
+STDOUT post-update
+STDERR post-update
+EOF
 test_expect_success 'send-pack stderr contains hook messages' '
-       grep "STDOUT update" send.err &&
-       grep "STDERR update" send.err &&
-       grep "STDOUT post-update" send.err &&
-       grep "STDERR post-update" send.err
+       egrep ^STD send.err >actual &&
+       git diff - actual <expect
 '
 
 test_done
diff --git a/t/t5515-fetch-merge-logic.sh b/t/t5515-fetch-merge-logic.sh
new file mode 100755 (executable)
index 0000000..6c9cc67
--- /dev/null
@@ -0,0 +1,162 @@
+#!/bin/sh
+#
+# Copyright (c) 2007 Santi Béjar, based on t4013 by Junio C Hamano
+#
+#
+
+test_description='Merge logic in fetch'
+
+. ./test-lib.sh
+
+LF='
+'
+
+test_expect_success setup '
+       GIT_AUTHOR_DATE="2006-06-26 00:00:00 +0000" &&
+       GIT_COMMITTER_DATE="2006-06-26 00:00:00 +0000" &&
+       export GIT_AUTHOR_DATE GIT_COMMITTER_DATE &&
+
+       echo >file original &&
+       git add file &&
+       git commit -a -m One &&
+       git tag tag-one &&
+       git tag tag-one-tree HEAD^{tree} &&
+       git branch one &&
+
+       echo two >> file &&
+       git commit -a -m Two &&
+       git tag -a -m "Tag Two" tag-two &&
+       git branch two &&
+
+       echo three >> file &&
+       git commit -a -m Three &&
+       git tag -a -m "Tag Three" tag-three &&
+       git tag -a -m "Tag Three file" tag-three-file HEAD^{tree}:file &&
+       git branch three &&
+
+       echo master >> file &&
+       git commit -a -m Master &&
+       git tag -a -m "Tag Master" tag-master &&
+
+       git checkout three &&
+
+       git clone . cloned &&
+       cd cloned &&
+       git config remote.origin.url ../.git/ &&
+
+       git config remote.config-explicit.url ../.git/ &&
+       git config remote.config-explicit.fetch refs/heads/master:remotes/rem/master &&
+       git config --add remote.config-explicit.fetch refs/heads/one:remotes/rem/one &&
+       git config --add remote.config-explicit.fetch two:remotes/rem/two &&
+       git config --add remote.config-explicit.fetch refs/heads/three:remotes/rem/three &&
+       remotes="config-explicit" &&
+
+       git config remote.config-glob.url ../.git/ &&
+       git config remote.config-glob.fetch refs/heads/*:refs/remotes/rem/* &&
+       remotes="$remotes config-glob" &&
+
+       mkdir -p .git/remotes &&
+       {
+               echo "URL: ../.git/"
+               echo "Pull: refs/heads/master:remotes/rem/master"
+               echo "Pull: refs/heads/one:remotes/rem/one"
+               echo "Pull: two:remotes/rem/two"
+               echo "Pull: refs/heads/three:remotes/rem/three"
+       } >.git/remotes/remote-explicit &&
+       remotes="$remotes remote-explicit" &&
+
+       {
+               echo "URL: ../.git/"
+               echo "Pull: refs/heads/*:refs/remotes/rem/*"
+       } >.git/remotes/remote-glob &&
+       remotes="$remotes remote-glob" &&
+
+       mkdir -p .git/branches &&
+       echo "../.git" > .git/branches/branches-default &&
+       remotes="$remotes branches-default" &&
+
+       echo "../.git#one" > .git/branches/branches-one &&
+       remotes="$remotes branches-one" &&
+
+       for remote in $remotes ; do
+               git config branch.br-$remote.remote $remote &&
+               git config branch.br-$remote-merge.remote $remote &&
+               git config branch.br-$remote-merge.merge refs/heads/three &&
+               git config branch.br-$remote-octopus.remote $remote &&
+               git config branch.br-$remote-octopus.merge refs/heads/one &&
+               git config --add branch.br-$remote-octopus.merge two &&
+               git config --add branch.br-$remote-octopus.merge remotes/rem/three
+       done
+'
+
+# Merge logic depends on branch properties and Pull: or .fetch lines
+for remote in $remotes ; do
+    for branch in "" "-merge" "-octopus" ; do
+cat <<EOF
+br-$remote$branch
+br-$remote$branch $remote
+EOF
+    done
+done > tests
+
+# Merge logic does not depend on branch properties,
+# but does depend on Pull: or fetch lines.
+# Use two branches completely unrelated from the arguments,
+# the clone default and one without branch properties
+for branch in master br-unconfig ; do
+    echo $branch
+    for remote in $remotes ; do
+       echo $branch $remote
+    done
+done >> tests
+
+# Merge logic does not depend on branch properties
+# neither in the Pull: or .fetch config
+for branch in master br-unconfig ; do
+    cat <<EOF
+$branch ../.git
+$branch ../.git one
+$branch ../.git one two
+$branch --tags ../.git
+$branch ../.git tag tag-one tag tag-three
+$branch ../.git tag tag-one-tree tag tag-three-file
+$branch ../.git one tag tag-one tag tag-three-file
+EOF
+done >> tests
+
+while read cmd
+do
+       case "$cmd" in
+       '' | '#'*) continue ;;
+       esac
+       test=`echo "$cmd" | sed -e 's|[/ ][/ ]*|_|g'`
+       cnt=`expr $test_count + 1`
+       pfx=`printf "%04d" $cnt`
+       expect="../../t5515/fetch.$test"
+       actual="$pfx-fetch.$test"
+
+       test_expect_success "$cmd" '
+               {
+                       echo "# $cmd"
+                       set x $cmd; shift
+                       git symbolic-ref HEAD refs/heads/$1 ; shift
+                       rm -f .git/FETCH_HEAD
+                       rm -f .git/refs/heads/*
+                       rm -f .git/refs/remotes/rem/*
+                       rm -f .git/refs/tags/*
+                       git fetch "$@" >/dev/null
+                       cat .git/FETCH_HEAD
+               } >"$actual" &&
+               if test -f "$expect"
+               then
+                       git diff -u "$expect" "$actual" &&
+                       rm -f "$actual"
+               else
+                       # this is to help developing new tests.
+                       cp "$actual" "$expect"
+                       false
+               fi
+       '
+done < tests
+
+test_done
diff --git a/t/t5515/fetch.br-branches-default b/t/t5515/fetch.br-branches-default
new file mode 100644 (file)
index 0000000..2e0414f
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-default
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-default-merge b/t/t5515/fetch.br-branches-default-merge
new file mode 100644 (file)
index 0000000..ea65f31
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-default-merge
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-default-merge_branches-default b/t/t5515/fetch.br-branches-default-merge_branches-default
new file mode 100644 (file)
index 0000000..7b5fa94
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-default-merge branches-default
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-default-octopus b/t/t5515/fetch.br-branches-default-octopus
new file mode 100644 (file)
index 0000000..128397d
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-default-octopus
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-default-octopus_branches-default b/t/t5515/fetch.br-branches-default-octopus_branches-default
new file mode 100644 (file)
index 0000000..4b37cd4
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-default-octopus branches-default
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-default_branches-default b/t/t5515/fetch.br-branches-default_branches-default
new file mode 100644 (file)
index 0000000..4a2bf3c
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-default branches-default
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-one b/t/t5515/fetch.br-branches-one
new file mode 100644 (file)
index 0000000..12ac8d2
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-one
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-one-merge b/t/t5515/fetch.br-branches-one-merge
new file mode 100644 (file)
index 0000000..3a4e77e
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-one-merge
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-one-merge_branches-one b/t/t5515/fetch.br-branches-one-merge_branches-one
new file mode 100644 (file)
index 0000000..00e04b4
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-one-merge branches-one
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-one-octopus b/t/t5515/fetch.br-branches-one-octopus
new file mode 100644 (file)
index 0000000..53fe808
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-one-octopus
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-one-octopus_branches-one b/t/t5515/fetch.br-branches-one-octopus_branches-one
new file mode 100644 (file)
index 0000000..41b18ff
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-one-octopus branches-one
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-branches-one_branches-one b/t/t5515/fetch.br-branches-one_branches-one
new file mode 100644 (file)
index 0000000..281fa09
--- /dev/null
@@ -0,0 +1,8 @@
+# br-branches-one branches-one
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-explicit b/t/t5515/fetch.br-config-explicit
new file mode 100644 (file)
index 0000000..e2fa9c8
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-explicit-merge b/t/t5515/fetch.br-config-explicit-merge
new file mode 100644 (file)
index 0000000..ec1a723
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-explicit-merge
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-explicit-merge_config-explicit b/t/t5515/fetch.br-config-explicit-merge_config-explicit
new file mode 100644 (file)
index 0000000..54f6891
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-explicit-merge config-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-explicit-octopus b/t/t5515/fetch.br-config-explicit-octopus
new file mode 100644 (file)
index 0000000..7011dfc
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-explicit-octopus
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8               branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-explicit-octopus_config-explicit b/t/t5515/fetch.br-config-explicit-octopus_config-explicit
new file mode 100644 (file)
index 0000000..bdad51f
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-explicit-octopus config-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8               branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-explicit_config-explicit b/t/t5515/fetch.br-config-explicit_config-explicit
new file mode 100644 (file)
index 0000000..1b237dd
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-explicit config-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-glob b/t/t5515/fetch.br-config-glob
new file mode 100644 (file)
index 0000000..e75ec2f
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-glob-merge b/t/t5515/fetch.br-config-glob-merge
new file mode 100644 (file)
index 0000000..ce8f739
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-glob-merge
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-glob-merge_config-glob b/t/t5515/fetch.br-config-glob-merge_config-glob
new file mode 100644 (file)
index 0000000..5817bed
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-glob-merge config-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-glob-octopus b/t/t5515/fetch.br-config-glob-octopus
new file mode 100644 (file)
index 0000000..9ee213e
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-glob-octopus
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-glob-octopus_config-glob b/t/t5515/fetch.br-config-glob-octopus_config-glob
new file mode 100644 (file)
index 0000000..44bd0ec
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-glob-octopus config-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-config-glob_config-glob b/t/t5515/fetch.br-config-glob_config-glob
new file mode 100644 (file)
index 0000000..a6c20f9
--- /dev/null
@@ -0,0 +1,11 @@
+# br-config-glob config-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-explicit b/t/t5515/fetch.br-remote-explicit
new file mode 100644 (file)
index 0000000..83534d2
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-explicit-merge b/t/t5515/fetch.br-remote-explicit-merge
new file mode 100644 (file)
index 0000000..a9064dd
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-explicit-merge
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-explicit-merge_remote-explicit b/t/t5515/fetch.br-remote-explicit-merge_remote-explicit
new file mode 100644 (file)
index 0000000..732a37e
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-explicit-merge remote-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-explicit-octopus b/t/t5515/fetch.br-remote-explicit-octopus
new file mode 100644 (file)
index 0000000..ecf020d
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-explicit-octopus
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8               branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit b/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit
new file mode 100644 (file)
index 0000000..af77531
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-explicit-octopus remote-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8               branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-explicit_remote-explicit b/t/t5515/fetch.br-remote-explicit_remote-explicit
new file mode 100644 (file)
index 0000000..51fae56
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-explicit remote-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-glob b/t/t5515/fetch.br-remote-glob
new file mode 100644 (file)
index 0000000..94e6ad3
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-glob-merge b/t/t5515/fetch.br-remote-glob-merge
new file mode 100644 (file)
index 0000000..09362e2
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-glob-merge
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-glob-merge_remote-glob b/t/t5515/fetch.br-remote-glob-merge_remote-glob
new file mode 100644 (file)
index 0000000..e2eabec
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-glob-merge remote-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-glob-octopus b/t/t5515/fetch.br-remote-glob-octopus
new file mode 100644 (file)
index 0000000..c1554f8
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-glob-octopus
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-glob-octopus_remote-glob b/t/t5515/fetch.br-remote-glob-octopus_remote-glob
new file mode 100644 (file)
index 0000000..e613434
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-glob-octopus remote-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-remote-glob_remote-glob b/t/t5515/fetch.br-remote-glob_remote-glob
new file mode 100644 (file)
index 0000000..646dbc8
--- /dev/null
@@ -0,0 +1,11 @@
+# br-remote-glob remote-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig b/t/t5515/fetch.br-unconfig
new file mode 100644 (file)
index 0000000..65ce6d9
--- /dev/null
@@ -0,0 +1,11 @@
+# br-unconfig
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_--tags_.._.git b/t/t5515/fetch.br-unconfig_--tags_.._.git
new file mode 100644 (file)
index 0000000..8258c80
--- /dev/null
@@ -0,0 +1,7 @@
+# br-unconfig --tags ../.git
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_.._.git b/t/t5515/fetch.br-unconfig_.._.git
new file mode 100644 (file)
index 0000000..284bb1f
--- /dev/null
@@ -0,0 +1,2 @@
+# br-unconfig ../.git
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               ../
diff --git a/t/t5515/fetch.br-unconfig_.._.git_one b/t/t5515/fetch.br-unconfig_.._.git_one
new file mode 100644 (file)
index 0000000..11eb5a6
--- /dev/null
@@ -0,0 +1,2 @@
+# br-unconfig ../.git one
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
diff --git a/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file b/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file
new file mode 100644 (file)
index 0000000..f02bab2
--- /dev/null
@@ -0,0 +1,8 @@
+# br-unconfig ../.git one tag tag-one tag tag-three-file
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               tag 'tag-one' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_.._.git_one_two b/t/t5515/fetch.br-unconfig_.._.git_one_two
new file mode 100644 (file)
index 0000000..3f1be22
--- /dev/null
@@ -0,0 +1,3 @@
+# br-unconfig ../.git one two
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8               branch 'two' of ../
diff --git a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file b/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file
new file mode 100644 (file)
index 0000000..85de411
--- /dev/null
@@ -0,0 +1,7 @@
+# br-unconfig ../.git tag tag-one-tree tag tag-three-file
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three b/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three
new file mode 100644 (file)
index 0000000..0da2337
--- /dev/null
@@ -0,0 +1,7 @@
+# br-unconfig ../.git tag tag-one tag tag-three
+8e32a6d901327a23ef831511badce7bf3bf46689               tag 'tag-one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               tag 'tag-three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_branches-default b/t/t5515/fetch.br-unconfig_branches-default
new file mode 100644 (file)
index 0000000..fc7041e
--- /dev/null
@@ -0,0 +1,8 @@
+# br-unconfig branches-default
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_branches-one b/t/t5515/fetch.br-unconfig_branches-one
new file mode 100644 (file)
index 0000000..e94cde7
--- /dev/null
@@ -0,0 +1,8 @@
+# br-unconfig branches-one
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_config-explicit b/t/t5515/fetch.br-unconfig_config-explicit
new file mode 100644 (file)
index 0000000..01a283e
--- /dev/null
@@ -0,0 +1,11 @@
+# br-unconfig config-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_config-glob b/t/t5515/fetch.br-unconfig_config-glob
new file mode 100644 (file)
index 0000000..3a556c5
--- /dev/null
@@ -0,0 +1,11 @@
+# br-unconfig config-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_remote-explicit b/t/t5515/fetch.br-unconfig_remote-explicit
new file mode 100644 (file)
index 0000000..db216df
--- /dev/null
@@ -0,0 +1,11 @@
+# br-unconfig remote-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.br-unconfig_remote-glob b/t/t5515/fetch.br-unconfig_remote-glob
new file mode 100644 (file)
index 0000000..aee65c2
--- /dev/null
@@ -0,0 +1,11 @@
+# br-unconfig remote-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master b/t/t5515/fetch.master
new file mode 100644 (file)
index 0000000..950fd07
--- /dev/null
@@ -0,0 +1,11 @@
+# master
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_--tags_.._.git b/t/t5515/fetch.master_--tags_.._.git
new file mode 100644 (file)
index 0000000..0e59950
--- /dev/null
@@ -0,0 +1,7 @@
+# master --tags ../.git
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_.._.git b/t/t5515/fetch.master_.._.git
new file mode 100644 (file)
index 0000000..66d1aad
--- /dev/null
@@ -0,0 +1,2 @@
+# master ../.git
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               ../
diff --git a/t/t5515/fetch.master_.._.git_one b/t/t5515/fetch.master_.._.git_one
new file mode 100644 (file)
index 0000000..35deddb
--- /dev/null
@@ -0,0 +1,2 @@
+# master ../.git one
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
diff --git a/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file b/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file
new file mode 100644 (file)
index 0000000..8286852
--- /dev/null
@@ -0,0 +1,8 @@
+# master ../.git one tag tag-one tag tag-three-file
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689               tag 'tag-one' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_.._.git_one_two b/t/t5515/fetch.master_.._.git_one_two
new file mode 100644 (file)
index 0000000..35ec578
--- /dev/null
@@ -0,0 +1,3 @@
+# master ../.git one two
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8               branch 'two' of ../
diff --git a/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file b/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file
new file mode 100644 (file)
index 0000000..2e133ef
--- /dev/null
@@ -0,0 +1,7 @@
+# master ../.git tag tag-one-tree tag tag-three-file
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three b/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three
new file mode 100644 (file)
index 0000000..92b18b4
--- /dev/null
@@ -0,0 +1,7 @@
+# master ../.git tag tag-one tag tag-three
+8e32a6d901327a23ef831511badce7bf3bf46689               tag 'tag-one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b               tag 'tag-three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_branches-default b/t/t5515/fetch.master_branches-default
new file mode 100644 (file)
index 0000000..603d6d2
--- /dev/null
@@ -0,0 +1,8 @@
+# master branches-default
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_branches-one b/t/t5515/fetch.master_branches-one
new file mode 100644 (file)
index 0000000..fe9bb0b
--- /dev/null
@@ -0,0 +1,8 @@
+# master branches-one
+8e32a6d901327a23ef831511badce7bf3bf46689               branch 'one' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_config-explicit b/t/t5515/fetch.master_config-explicit
new file mode 100644 (file)
index 0000000..4be97c7
--- /dev/null
@@ -0,0 +1,11 @@
+# master config-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_config-glob b/t/t5515/fetch.master_config-glob
new file mode 100644 (file)
index 0000000..cb0726f
--- /dev/null
@@ -0,0 +1,11 @@
+# master config-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_remote-explicit b/t/t5515/fetch.master_remote-explicit
new file mode 100644 (file)
index 0000000..44a1ca8
--- /dev/null
@@ -0,0 +1,11 @@
+# master remote-explicit
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f               branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
diff --git a/t/t5515/fetch.master_remote-glob b/t/t5515/fetch.master_remote-glob
new file mode 100644 (file)
index 0000000..724e8db
--- /dev/null
@@ -0,0 +1,11 @@
+# master remote-glob
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   branch 'master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   branch 'one' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   branch 'three' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   branch 'two' of ../
+754b754407bf032e9a2f9d5a9ad05ca79a6b228f       not-for-merge   tag 'tag-master' of ../
+8e32a6d901327a23ef831511badce7bf3bf46689       not-for-merge   tag 'tag-one' of ../
+22feea448b023a2d864ef94b013735af34d238ba       not-for-merge   tag 'tag-one-tree' of ../
+0567da4d5edd2ff4bb292a465ba9e64dcad9536b       not-for-merge   tag 'tag-three' of ../
+0e3b14047d3ee365f4f2a1b673db059c3972589c       not-for-merge   tag 'tag-three-file' of ../
+6134ee8f857693b96ff1cc98d3e2fd62b199e5a8       not-for-merge   tag 'tag-two' of ../
index f3cd3dba4df6ac1582956a1f9d17a9818aeb694d..c76fccfb5a0811aca3bb5af67f8558745935148f 100644 (file)
@@ -63,7 +63,7 @@ test_expect_success "merge without conflict (missing LF at EOF)" \
        "git-merge-file test2.txt orig.txt new2.txt"
 
 test_expect_success "merge result added missing LF" \
-       "diff -u test.txt test2.txt"
+       "git diff test.txt test2.txt"
 
 cp test.txt backup.txt
 test_expect_failure "merge with conflicts" \
@@ -86,7 +86,7 @@ non timebo mala, quoniam tu mecum es:
 virga tua et baculus tuus ipsa me consolata sunt.
 EOF
 
-test_expect_success "expected conflict markers" "diff -u test.txt expect.txt"
+test_expect_success "expected conflict markers" "git diff test.txt expect.txt"
 
 cp backup.txt test.txt
 test_expect_failure "merge with conflicts, using -L" \
@@ -110,7 +110,7 @@ virga tua et baculus tuus ipsa me consolata sunt.
 EOF
 
 test_expect_success "expected conflict markers, with -L" \
-       "diff -u test.txt expect.txt"
+       "git diff test.txt expect.txt"
 
 sed "s/ tu / TU /" < new1.txt > new5.txt
 test_expect_failure "conflict in removed tail" \
@@ -132,7 +132,7 @@ virga tua et baculus tuus ipsa me consolata sunt.
 >>>>>>> new5.txt
 EOF
 
-test_expect_success "expected conflict markers" "diff -u expect out"
+test_expect_success "expected conflict markers" "git diff expect out"
 
 test_done
 
index 31b96257b454c62ce84c3d883e961c41740ddddd..a398556137205d9fb561746335a13330a5aeda54 100644 (file)
@@ -70,7 +70,7 @@ G
 >>>>>>> G:a1
 EOF
 
-test_expect_success "result contains a conflict" "diff -u expect a1"
+test_expect_success "result contains a conflict" "git diff expect a1"
 
 git ls-files --stage > out
 cat > expect << EOF
@@ -79,6 +79,6 @@ cat > expect << EOF
 100644 fd7923529855d0b274795ae3349c5e0438333979 3      a1
 EOF
 
-test_expect_success "virtual trees were processed" "diff -u expect out"
+test_expect_success "virtual trees were processed" "git diff expect out"
 
 test_done
index ea140236162894ed2e5691b57ba8c5cf98e5627d..526d7d1c4422e342c7257e260626dac3dda36a3a 100755 (executable)
@@ -79,7 +79,7 @@ test_expect_success 'merge-msg test #1' '
        git fetch . left &&
 
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
-       diff -u actual expected
+       git diff actual expected
 '
 
 cat >expected <<\EOF
@@ -92,7 +92,7 @@ test_expect_success 'merge-msg test #2' '
        git fetch ../trash left &&
 
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
-       diff -u actual expected
+       git diff actual expected
 '
 
 cat >expected <<\EOF
@@ -115,7 +115,7 @@ test_expect_success 'merge-msg test #3' '
        git fetch . left &&
 
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
-       diff -u actual expected
+       git diff actual expected
 '
 
 cat >expected <<\EOF
@@ -145,7 +145,7 @@ test_expect_success 'merge-msg test #4' '
        git fetch . left right &&
 
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
-       diff -u actual expected
+       git diff actual expected
 '
 
 test_expect_success 'merge-msg test #5' '
@@ -157,7 +157,7 @@ test_expect_success 'merge-msg test #5' '
        git fetch . left right &&
 
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
-       diff -u actual expected
+       git diff actual expected
 '
 
 test_done
index 7dcfc7e7db47a815606577b366f309f590896082..eb628fe07543d07812525942cba11b8133f2e000 100755 (executable)
@@ -169,7 +169,7 @@ test_expect_success "$name" "
        svn up '$SVN_TREE' &&
        test -f '$SVN_TREE'/exec-2.sh &&
        test ! -L '$SVN_TREE'/exec-2.sh &&
-       diff -u help $SVN_TREE/exec-2.sh"
+       git diff help $SVN_TREE/exec-2.sh"
 
 if test "$have_utf8" = t
 then
@@ -193,7 +193,7 @@ test_expect_success "$name" \
     "git-svn init $svnrepo && git-svn fetch &&
      git-rev-list --pretty=raw remotes/git-svn | grep ^tree | uniq > a &&
      git-rev-list --pretty=raw remotes/alt | grep ^tree | uniq > b &&
-     diff -u a b"
+     git diff a b"
 
 name='check imported tree checksums expected tree checksums'
 rm -f expected
@@ -211,7 +211,7 @@ tree d667270a1f7b109f5eb3aaea21ede14b56bfdd6e
 tree 8f51f74cf0163afc9ad68a4b1537288c4558b5a4
 EOF
 
-test_expect_success "$name" "diff -u a expected"
+test_expect_success "$name" "git diff a expected"
 
 test_expect_failure 'exit if remote refs are ambigious' "
         git-config --add svn-remote.svn.fetch \
index 970d683650f5ee6b99a07ff10063710292b28ed1..03f2f8f347f388a381447e238051cbb92b990dd8 100755 (executable)
@@ -74,7 +74,7 @@ EOF
 test_expect_success \
        'A: verify commit' \
        'git-cat-file commit master | sed 1d >actual &&
-       diff -u expect actual'
+       git diff expect actual'
 
 cat >expect <<EOF
 100644 blob file2
@@ -84,22 +84,22 @@ EOF
 test_expect_success \
        'A: verify tree' \
        'git-cat-file -p master^{tree} | sed "s/ [0-9a-f]*      / /" >actual &&
-        diff -u expect actual'
+        git diff expect actual'
 
 echo "$file2_data" >expect
 test_expect_success \
        'A: verify file2' \
-       'git-cat-file blob master:file2 >actual && diff -u expect actual'
+       'git-cat-file blob master:file2 >actual && git diff expect actual'
 
 echo "$file3_data" >expect
 test_expect_success \
        'A: verify file3' \
-       'git-cat-file blob master:file3 >actual && diff -u expect actual'
+       'git-cat-file blob master:file3 >actual && git diff expect actual'
 
 printf "$file4_data" >expect
 test_expect_success \
        'A: verify file4' \
-       'git-cat-file blob master:file4 >actual && diff -u expect actual'
+       'git-cat-file blob master:file4 >actual && git diff expect actual'
 
 cat >expect <<EOF
 :2 `git-rev-parse --verify master:file2`
@@ -109,7 +109,15 @@ cat >expect <<EOF
 EOF
 test_expect_success \
        'A: verify marks output' \
-       'diff -u expect marks.out'
+       'git diff expect marks.out'
+
+test_expect_success \
+       'A: verify marks import' \
+       'git-fast-import \
+               --import-marks=marks.out \
+               --export-marks=marks.new \
+               </dev/null &&
+       git diff -u expect marks.new'
 
 ###
 ### series B
@@ -175,7 +183,7 @@ EOF
 test_expect_success \
        'C: verify commit' \
        'git-cat-file commit branch | sed 1d >actual &&
-        diff -u expect actual'
+        git diff expect actual'
 
 cat >expect <<EOF
 :000000 100755 0000000000000000000000000000000000000000 f1fb5da718392694d0076d677d6d0e364c79b0bc A     file2/newf
@@ -232,13 +240,13 @@ echo "$file5_data" >expect
 test_expect_success \
        'D: verify file5' \
        'git-cat-file blob branch:newdir/interesting >actual &&
-        diff -u expect actual'
+        git diff expect actual'
 
 echo "$file6_data" >expect
 test_expect_success \
        'D: verify file6' \
        'git-cat-file blob branch:newdir/exec.sh >actual &&
-        diff -u expect actual'
+        git diff expect actual'
 
 ###
 ### series E
@@ -274,7 +282,7 @@ EOF
 test_expect_success \
        'E: verify commit' \
        'git-cat-file commit branch | sed 1,2d >actual &&
-       diff -u expect actual'
+       git diff expect actual'
 
 ###
 ### series F
@@ -327,7 +335,7 @@ EOF
 test_expect_success \
        'F: verify other commit' \
        'git-cat-file commit other >actual &&
-       diff -u expect actual'
+       git diff expect actual'
 
 ###
 ### series G
@@ -405,7 +413,7 @@ echo "$file5_data" >expect
 test_expect_success \
        'H: verify file' \
        'git-cat-file blob H:h/e/l/lo >actual &&
-        diff -u expect actual'
+        git diff expect actual'
 
 ###
 ### series I
@@ -431,7 +439,7 @@ EOF
 test_expect_success \
        'I: verify edge list' \
        'sed -e s/pack-.*pack/pack-.pack/ edges.list >actual &&
-        diff -u expect actual'
+        git diff expect actual'
 
 ###
 ### series J
index 0eeee43feb97ac79406d196c735e4027c4e9cdfd..b8352e731bf4baffbda780a1420f52ca4670b828 100644 (file)
@@ -1,5 +1,9 @@
 # make and install sample templates
 
+ifndef V
+       QUIET = @
+endif
+
 INSTALL ?= install
 TAR ?= tar
 prefix ?= $(HOME)
@@ -18,7 +22,7 @@ all: boilerplates.made custom
 
 bpsrc = $(filter-out %~,$(wildcard *--*))
 boilerplates.made : $(bpsrc)
-       ls *--* 2>/dev/null | \
+       $(QUIET)ls *--* 2>/dev/null | \
        while read boilerplate; \
        do \
                case "$$boilerplate" in *~) continue ;; esac && \
@@ -29,13 +33,13 @@ boilerplates.made : $(bpsrc)
                *--) ;; \
                *) cp $$boilerplate blt/$$dst ;; \
                esac || exit; \
-       done || exit
+       done && \
        date >$@
 
 # If you need build-tailored templates, build them into blt/
 # directory yourself here.
 custom:
-       : no custom templates yet
+       $(QUIET): no custom templates yet
 
 clean:
        rm -rf blt boilerplates.made
index 6c1f99b149f0800a9c9ab1b45033bc1401a84766..10816e95a07c23dda7554c102c306d7e9beca606 100644 (file)
@@ -107,16 +107,18 @@ int read_mmfile(mmfile_t *ptr, const char *filename)
 {
        struct stat st;
        FILE *f;
+       size_t sz;
 
        if (stat(filename, &st))
                return error("Could not stat %s", filename);
        if ((f = fopen(filename, "rb")) == NULL)
                return error("Could not open %s", filename);
-       ptr->ptr = xmalloc(st.st_size);
-       if (fread(ptr->ptr, st.st_size, 1, f) != 1)
+       sz = xsize_t(st.st_size);
+       ptr->ptr = xmalloc(sz);
+       if (fread(ptr->ptr, sz, 1, f) != 1)
                return error("Could not read %s", filename);
        fclose(f);
-       ptr->size = st.st_size;
+       ptr->size = sz;
        return 0;
 }