gitweb.git
prepare_revision_walk(): check for return value in... Stefan Beller Sun, 10 Aug 2014 21:33:26 +0000 (23:33 +0200)

prepare_revision_walk(): check for return value in all places

Even the documentation tells us:

You should check if it returns any error (non-zero return
code) and if it does not, you can start using get_revision()
to do the iteration.

In preparation for this commit, I grepped all occurrences of
prepare_revision_walk and added error messages, when there were none.

Signed-off-by: Stefan Beller <stefanbeller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

utf8.c: fix strbuf_utf8_replace() consuming data beyond... Nguyễn Thái Ngọc Duy Sun, 10 Aug 2014 07:05:21 +0000 (14:05 +0700)

utf8.c: fix strbuf_utf8_replace() consuming data beyond input string

The main loop in strbuf_utf8_replace() could summed up as:

while ('src' is still valid) {
1) advance 'src' to copy ANSI escape sequences
2) advance 'src' to copy/replace visible characters
}

The problem is after #1, 'src' may have reached the end of the string
(so 'src' points to NUL) and #2 will continue to copy that NUL as if
it's a normal character. Because the output is stored in a strbuf,
this NUL accounted in the 'len' field as well. Check after #1 and
break the loop if necessary.

The test does not look obvious, but the combination of %>>() should
make a call trace like this

show_log()
pretty_print_commit()
format_commit_message()
strbuf_expand()
format_commit_item()
format_and_pad_commit()
strbuf_utf8_replace()

where %C(auto)%d would insert a color reset escape sequence in the end
of the string given to strbuf_utf8_replace() and show_log() uses
fwrite() to send everything to stdout (including the incorrect NUL
inserted by strbuf_utf8_replace)

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

mv: flatten error handling code blockNguyễn Thái Ngọc Duy Sun, 10 Aug 2014 02:29:30 +0000 (09:29 +0700)

mv: flatten error handling code block

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

mv: mark strings for translationsNguyễn Thái Ngọc Duy Sun, 10 Aug 2014 02:29:29 +0000 (09:29 +0700)

mv: mark strings for translations

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

clone.c: don't leak memory in cmd_cloneStefan Beller Sun, 10 Aug 2014 13:57:56 +0000 (15:57 +0200)

clone.c: don't leak memory in cmd_clone

Free the refspec.
Found by scan.coverity.com (Id: 1127806)

Signed-off-by: Stefan Beller <stefanbeller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

remote.c: don't leak the base branch name in format_tra... Stefan Beller Sun, 10 Aug 2014 19:43:33 +0000 (21:43 +0200)

remote.c: don't leak the base branch name in format_tracking_info

Found by scan.coverity.com (Id: 1127809)

Signed-off-by: Stefan Beller <stefanbeller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

read-cache: check for leading symlinks when refreshing... René Scharfe Sat, 9 Aug 2014 17:43:29 +0000 (19:43 +0200)

read-cache: check for leading symlinks when refreshing index

Don't add paths with leading symlinks to the index while refreshing; we
only track those symlinks themselves. We already ignore them while
preloading (see read_index_preload.c).

Reported-by: Nikolay Avdeev <avdeev@math.vsu.ru>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'master' of git://ozlabs.org/~paulus/gitkJunio C Hamano Sun, 10 Aug 2014 18:03:03 +0000 (11:03 -0700)

Merge branch 'master' of git://ozlabs.org/~paulus/gitk

* 'master' of git://ozlabs.org/~paulus/gitk:
gitk: Updated Bulgarian translation (302t,0f,0u)
gitk: Add keybinding to switch to parent commit

Git 2.1-rc2 v2.1.0-rc2Junio C Hamano Fri, 8 Aug 2014 20:52:16 +0000 (13:52 -0700)

Git 2.1-rc2

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: git-init: flesh out exampleLinus Arver Fri, 8 Aug 2014 17:29:20 +0000 (10:29 -0700)

Documentation: git-init: flesh out example

Add a third step `git commit` after adding files for the first time.

Signed-off-by: Linus Arver <linusarver@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: git-init: template directory: reword... Linus Arver Fri, 8 Aug 2014 17:29:19 +0000 (10:29 -0700)

Documentation: git-init: template directory: reword and cross-reference

Signed-off-by: Linus Arver <linusarver@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: git-init: reword parenthetical statementsLinus Arver Fri, 8 Aug 2014 17:29:18 +0000 (10:29 -0700)

Documentation: git-init: reword parenthetical statements

Signed-off-by: Linus Arver <linusarver@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: git-init: --separate-git-dir: clarifyLinus Arver Fri, 8 Aug 2014 17:29:17 +0000 (10:29 -0700)

Documentation: git-init: --separate-git-dir: clarify

Use shorter sentences to describe what actually happens. We describe
what the term "Git symbolic link" actually means.

Also, we separate out the description of the behavioral change upon
reinitialization into its own paragraph.

Signed-off-by: Linus Arver <linusarver@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: git-init: template directory: rewordLinus Arver Fri, 8 Aug 2014 17:29:16 +0000 (10:29 -0700)

Documentation: git-init: template directory: reword

Signed-off-by: Linus Arver <linusarver@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: git-init: list items faceliftLinus Arver Fri, 8 Aug 2014 17:29:15 +0000 (10:29 -0700)

Documentation: git-init: list items facelift

No textual change.

Signed-off-by: Linus Arver <linusarver@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: git-init: typographical fixesLinus Arver Fri, 8 Aug 2014 17:29:14 +0000 (10:29 -0700)

Documentation: git-init: typographical fixes

Use backticks when we quote something that the user should literally
use.

Signed-off-by: Linus Arver <linusarver@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

gitk: Updated Bulgarian translation (302t,0f,0u)Alexander Shopov Sun, 3 Aug 2014 12:36:43 +0000 (15:36 +0300)

gitk: Updated Bulgarian translation (302t,0f,0u)

Signed-off-by: Alexander Shopov <ash@kambanaria.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>

gitk: Add keybinding to switch to parent commitMax Kirillov Tue, 8 Jul 2014 20:45:35 +0000 (23:45 +0300)

gitk: Add keybinding to switch to parent commit

Signed-off-by: Max Kirillov <max@max630.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>

bundle: fix exclusion of annotated tagsLukas Fleischer Sat, 2 Aug 2014 08:39:06 +0000 (10:39 +0200)

bundle: fix exclusion of annotated tags

In commit c9a42c4 (bundle: allow rev-list options to exclude annotated
tags, 2009-01-02), support for excluding annotated tags outside the
specified date range was added. However, the wrong order of parameters
was chosen when calling memchr().

Fix this by swapping the character to search for with the maximum length
parameter. Also cover this behavior with an additional test.

Signed-off-by: Lukas Fleischer <git@cryptocrack.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

stash: default listing to working-tree diffJeff King Wed, 6 Aug 2014 18:35:25 +0000 (14:35 -0400)

stash: default listing to working-tree diff

When you list stashes, you can provide arbitrary git-log
options to change the display. However, adding just "-p"
does nothing, because each stash is actually a merge commit.

This implementation detail is easy to forget, leading to
confused users who think "-p" is not working. We can make
this easier by defaulting to "--first-parent -m", which will
show the diff against the working tree. This omits the
index portion of the stash entirely, but it's simple and it
matches what "git stash show" provides.

People who are more clueful about stash's true form can use
"--cc" to override the "-m", and the "--first-parent" will
then do nothing. For diffs, it only affects non-combined
diffs, so "--cc" overrides it. And for the traversal, we are
walking the linear reflog anyway, so we do not even care
about the parents.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

branch.c: replace `git_config()` with `git_config_get_s... Tanay Abhra Thu, 7 Aug 2014 17:56:42 +0000 (23:26 +0530)

branch.c: replace `git_config()` with `git_config_get_string()

Use `git_config_get_string()` instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow. While we are at
it, return -1 if we find no value for the queried variable. Original code
returned 0 for all cases, which was checked by `add_branch_desc()` in
fmt-merge-msg.c resulting in addition of a spurious newline to the `out`
strbuf. Now, the newline addition is skipped as -1 is returned to the caller
if no value is found.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

alias.c: replace `git_config()` with `git_config_get_st... Tanay Abhra Thu, 7 Aug 2014 16:21:25 +0000 (09:21 -0700)

alias.c: replace `git_config()` with `git_config_get_string()`

Use `git_config_get_string()` instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

imap-send.c: replace `git_config()` with `git_config_ge... Tanay Abhra Thu, 7 Aug 2014 16:21:24 +0000 (09:21 -0700)

imap-send.c: replace `git_config()` with `git_config_get_*()` family

Use `git_config_get_*()` family instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

pager.c: replace `git_config()` with `git_config_get_va... Tanay Abhra Thu, 7 Aug 2014 16:21:23 +0000 (09:21 -0700)

pager.c: replace `git_config()` with `git_config_get_value()`

Use `git_config_get_value()` instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/gc.c: replace `git_config()` with `git_config_g... Tanay Abhra Thu, 7 Aug 2014 16:21:22 +0000 (09:21 -0700)

builtin/gc.c: replace `git_config()` with `git_config_get_*()` family

Use `git_config_get_*()` family instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

rerere.c: replace `git_config()` with `git_config_get_... Tanay Abhra Thu, 7 Aug 2014 16:21:21 +0000 (09:21 -0700)

rerere.c: replace `git_config()` with `git_config_get_*()` family

Use `git_config_get_*()` family instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

fetchpack.c: replace `git_config()` with `git_config_ge... Tanay Abhra Thu, 7 Aug 2014 16:21:20 +0000 (09:21 -0700)

fetchpack.c: replace `git_config()` with `git_config_get_*()` family

Use `git_config_get_*()` family instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

archive.c: replace `git_config()` with `git_config_get_... Tanay Abhra Thu, 7 Aug 2014 16:21:19 +0000 (09:21 -0700)

archive.c: replace `git_config()` with `git_config_get_bool()` family

Use `git_config_get_bool()` family instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

read-cache.c: replace `git_config()` with `git_config_g... Tanay Abhra Thu, 7 Aug 2014 16:21:18 +0000 (09:21 -0700)

read-cache.c: replace `git_config()` with `git_config_get_*()` family

Use `git_config_get_*()` family instead of `git_config()` to take
advantage of the config-set API which provides a cleaner control flow.

Use an intermediate value, as `version` can not be used directly in
git_config_get_int() due to incompatible type.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

http-backend.c: replace `git_config()` with `git_config... Tanay Abhra Thu, 7 Aug 2014 16:21:17 +0000 (09:21 -0700)

http-backend.c: replace `git_config()` with `git_config_get_bool()` family

Use `git_config_get_bool()` family instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

daemon.c: replace `git_config()` with `git_config_get_b... Tanay Abhra Thu, 7 Aug 2014 16:21:16 +0000 (09:21 -0700)

daemon.c: replace `git_config()` with `git_config_get_bool()` family

Use `git_config_get_bool()` family instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/log.c: fix minor memory leakMatthieu Moy Thu, 7 Aug 2014 17:13:37 +0000 (19:13 +0200)

builtin/log.c: fix minor memory leak

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

apply: omit ws check for excluded pathsJunio C Hamano Wed, 6 Aug 2014 20:09:05 +0000 (13:09 -0700)

apply: omit ws check for excluded paths

Whitespace breakages are checked while the patch is being parsed.
Disable them at the beginning of parse_chunk(), where each
individual patch is parsed, immediately after we learn the name of
the file the patch applies to and before we start parsing the diff
contained in the patch.

One may naively think that we should be able to not just skip the
whitespace checks but simply fast-forward to the next patch without
doing anything once use_patch() tells us that this patch is not
going to be used. But in reality we cannot really skip much of the
parsing in order to do such a "fast-forward", primarily because
parsing "@@ -k,l +m,n @@" lines and counting the input lines is how
we determine the boundaries of individual patches.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

apply: hoist use_patch() helper for path exclusion upJunio C Hamano Wed, 6 Aug 2014 20:11:17 +0000 (13:11 -0700)

apply: hoist use_patch() helper for path exclusion up

We will be adding a caller to the function a bit earlier in this
file in a later patch.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

apply: use the right attribute for paths in non-Git... Junio C Hamano Wed, 6 Aug 2014 21:26:24 +0000 (14:26 -0700)

apply: use the right attribute for paths in non-Git patches

We parse each patchfile and find the name of the path the patch
applies to, and then use that name to consult the attribute system
to find the whitespace rules to be used, and also the target file
(either in the working tree or in the index) to replay the changes
against.

Unlike a Git-generated patch, a non-Git patch is taken to have the
pathnames relative to the current working directory. The names
found in such a patch are modified by prepending the prefix by the
prefix_patches() helper function introduced in 56185f49 (git-apply:
require -p<n> when working in a subdirectory., 2007-02-19).

However, this prefixing is done after the patch is fully parsed and
affects only what target files are patched. Because the attributes
are checked against the names found in the patch during the parsing,
not against the final pathname, the whitespace check that is done
during parsing ends up using attributes for a wrong path for non-Git
patches.

Fix this by doing the prefix much earlier, immediately after the
header part of each patch is parsed and we learn the name of the
path the patch affects.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

add tests for `git_config_get_string_const()`Tanay Abhra Thu, 7 Aug 2014 11:59:19 +0000 (04:59 -0700)

add tests for `git_config_get_string_const()`

Add tests for `git_config_get_string_const()`, check whether it
dies printing the line number and the file name if a NULL
value is retrieved for the given key.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add a test for semantic errors in config filesTanay Abhra Thu, 7 Aug 2014 11:59:18 +0000 (04:59 -0700)

add a test for semantic errors in config files

Semantic errors (for example, for alias.* variables NULL values are
not allowed) in configuration files cause a die printing the line
number and file name of the offending value.

Add a test documenting that such errors cause a die printing the
accurate line number and file name.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

rewrite git_config() to use the config-set APITanay Abhra Thu, 7 Aug 2014 11:59:17 +0000 (04:59 -0700)

rewrite git_config() to use the config-set API

Of all the functions in `git_config*()` family, `git_config()` has the
most invocations in the whole code base. Each `git_config()` invocation
causes config file rereads which can be avoided using the config-set API.

Use the config-set API to rewrite `git_config()` to use the config caching
layer to avoid config file rereads on each invocation during a git process
lifetime. First invocation constructs the cache, and after that for each
successive invocation, `git_config()` feeds values from the config cache
instead of rereading the configuration files.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

config: add `git_die_config()` to the config-set APITanay Abhra Thu, 7 Aug 2014 11:59:16 +0000 (04:59 -0700)

config: add `git_die_config()` to the config-set API

Add `git_die_config` that dies printing the line number and the file name
of the highest priority value for the configuration variable `key`. A custom
error message is also printed before dying, specified by the caller, which can
be skipped if `err` argument is set to NULL.

It has usage in non-callback based config value retrieval where we can
raise an error and die if there is a semantic error.
For example,

if (!git_config_get_value(key, &value)){
if (!strcmp(value, "foo"))
git_config_die(key, "value: `%s` is illegal", value);
else
/* do work */
}

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

change `git_config()` return value to voidTanay Abhra Thu, 7 Aug 2014 11:59:15 +0000 (04:59 -0700)

change `git_config()` return value to void

Currently `git_config()` returns an integer signifying an error code.
During rewrites of the function most of the code was shifted to
`git_config_with_options()`. `git_config_with_options()` normally
returns positive values if its `config_source` parameter is set as NULL,
as most errors are fatal, and non-fatal potential errors are guarded
by "if" statements that are entered only when no error is possible.

Still a negative value can be returned in case of race condition between
`access_or_die()` & `git_config_from_file()`. Also, all callers of
`git_config()` ignore the return value except for one case in branch.c.

Change `git_config()` return value to void and make it die if it receives
a negative value from `git_config_with_options()`.

Original-patch-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add line number and file name info to `config_set`Tanay Abhra Thu, 7 Aug 2014 11:59:14 +0000 (04:59 -0700)

add line number and file name info to `config_set`

Store file name and line number for each key-value pair in the cache
during parsing of the configuration files.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

config.c: fix accuracy of line number in errorsMatthieu Moy Thu, 7 Aug 2014 11:59:13 +0000 (04:59 -0700)

config.c: fix accuracy of line number in errors

If a callback returns a negative value to `git_config*()` family,
they call `die()` while printing the line number and the file name.
Currently the printed line number is off by one, thus printing the
wrong line number.

Make `linenr` point to the line we just parsed during the call
to callback to get accurate line number in error messages.

Commit-message-by: Tanay Abhra <tanayabh@gmail.com>
Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

config.c: mark error and warnings strings for translationMatthieu Moy Thu, 7 Aug 2014 11:59:12 +0000 (04:59 -0700)

config.c: mark error and warnings strings for translation

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'mb/relnotes-2.1'Junio C Hamano Thu, 7 Aug 2014 16:44:17 +0000 (09:44 -0700)

Merge branch 'mb/relnotes-2.1'

* mb/relnotes-2.1:
Release notes: grammatical fixes
RelNotes: no more check_ref_format micro-optimization

Release notes: grammatical fixesMarc Branchaud Tue, 5 Aug 2014 16:50:45 +0000 (12:50 -0400)

Release notes: grammatical fixes

Signed-off-by: Marc Branchaud <marcnarc@xiplink.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

various contrib: Fix links in man pagesStefan Beller Thu, 7 Aug 2014 14:27:12 +0000 (16:27 +0200)

various contrib: Fix links in man pages

Inspired by 2147fa7e (2014-07-31 git-push: fix link in man page),
I grepped through the whole tree searching for 'gitlink:' occurrences.

Signed-off-by: Stefan Beller <stefanbeller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

l10n: fr.po (2257t) update for version 2.1.0Jean-Noel Avila Tue, 5 Aug 2014 17:23:50 +0000 (19:23 +0200)

l10n: fr.po (2257t) update for version 2.1.0

Signed-off-by: Jean-Noel Avila <jn.avila@free.fr>

imap-send doc: omit confusing "to use imap-send" modifierbrian m. carlson Tue, 5 Aug 2014 02:56:50 +0000 (02:56 +0000)

imap-send doc: omit confusing "to use imap-send" modifier

It wouldn't make sense for these configuration variables to be
required for Git in general to function. 'Required' in this context
means required for git imap-send to work.

Noticed while trying to figure out what the sentence describing
imap.tunnel meant.

[jn: expanded to also simplify explanation of imap.folder and
imap.host in the same way]

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

RelNotes: no more check_ref_format micro-optimizationJunio C Hamano Tue, 5 Aug 2014 18:44:23 +0000 (11:44 -0700)

RelNotes: no more check_ref_format micro-optimization

Signed-off-by: Junio C Hamano <gitster@pobox.com>

config: teach "git -c" to recognize an empty stringJunio C Hamano Mon, 4 Aug 2014 22:40:19 +0000 (15:40 -0700)

config: teach "git -c" to recognize an empty string

In a config file, you can do:

[foo]
bar

to turn the "foo.bar" boolean flag on, and you can do:

[foo]
bar=

to set "foo.bar" to the empty string. However, git's "-c"
parameter treats both:

git -c foo.bar

and

git -c foo.bar=

as the boolean flag, and there is no way to set a variable
to the empty string. This patch enables the latter form to
do that.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge remote-tracking branch 'l10n/vi/vnwildman/master'Jiang Xin Tue, 5 Aug 2014 15:07:22 +0000 (23:07 +0800)

Merge remote-tracking branch 'l10n/vi/vnwildman/master'

* l10n/vi/vnwildman/master:
l10n: vi.po (2257t): Update translation

Merge branch 'master' of github.com:alshopov/git-poJiang Xin Tue, 5 Aug 2014 14:41:00 +0000 (22:41 +0800)

Merge branch 'master' of github.com:alshopov/git-po

* 'master' of github.com:alshopov/git-po:
l10n: Updated Bulgarian translation of git (2257t,0f,0u)

l10n: sv.po: Update Swedish translation (2257t0f0u)Peter Krefting Tue, 5 Aug 2014 12:49:51 +0000 (13:49 +0100)

l10n: sv.po: Update Swedish translation (2257t0f0u)

Signed-off-by: Peter Krefting <peter@softwolves.pp.se>

l10n: vi.po (2257t): Update translationTran Ngoc Quan Tue, 5 Aug 2014 00:35:56 +0000 (07:35 +0700)

l10n: vi.po (2257t): Update translation

Signed-off-by: Tran Ngoc Quan <vnwildman@gmail.com>

Git 2.1.0-rc1 v2.1.0-rc1Junio C Hamano Mon, 4 Aug 2014 21:05:06 +0000 (14:05 -0700)

Git 2.1.0-rc1

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'tf/maint-doc-push'Junio C Hamano Mon, 4 Aug 2014 21:03:45 +0000 (14:03 -0700)

Merge branch 'tf/maint-doc-push'

* tf/maint-doc-push:
git-push: fix link in man page

Merge branch 'ta/doc-config'Junio C Hamano Mon, 4 Aug 2014 21:03:25 +0000 (14:03 -0700)

Merge branch 'ta/doc-config'

* ta/doc-config:
add documentation for writing config files

pretty.c: make git_pretty_formats_config return -1... Tanay Abhra Mon, 4 Aug 2014 14:41:15 +0000 (07:41 -0700)

pretty.c: make git_pretty_formats_config return -1 on git_config_string failure

`git_pretty_formats_config()` continues without checking git_config_string's
return value which can lead to a SEGFAULT. Instead return -1 when
git_config_string fails signalling `git_config()` to die printing the location
of the erroneous variable.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

archive: honor tar.umask even for pax headersbrian m. carlson Sun, 3 Aug 2014 03:02:03 +0000 (03:02 +0000)

archive: honor tar.umask even for pax headers

git archive's tar format uses extended pax headers to encode metadata
into the archive. Most tar implementations correctly treat these as
metadata, but some that do not understand the pax format extract these
as files instead. Apply the tar.umask setting to these entries to
prevent tampering by other users.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

l10n: Updated Bulgarian translation of git (2257t,0f,0u)Alexander Shopov Sun, 3 Aug 2014 10:04:51 +0000 (13:04 +0300)

l10n: Updated Bulgarian translation of git (2257t,0f,0u)

Sync with tags v2.1.0-rc1 and v2.0.4

Signed-off-by: Alexander Shopov <ash@kambanaria.org>

l10n: zh_CN: translations for git v2.1.0-rc0Jiang Xin Mon, 4 Aug 2014 08:23:15 +0000 (16:23 +0800)

l10n: zh_CN: translations for git v2.1.0-rc0

Translate 37 new messages (2257t0f0u) for git v2.1.0-rc0.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>

Merge commit 'bg/alshopov/master'Jiang Xin Mon, 4 Aug 2014 08:38:00 +0000 (16:38 +0800)

Merge commit 'bg/alshopov/master'

* commit 'bg/alshopov/master':
l10n: Updated Bulgarian translation of git (2247t,0f,0u)
l10n: Updated Bulgarian translation of git (2228t,0f,0u)

Merge remote-tracking branch 'sv/nafmo/master'Jiang Xin Mon, 4 Aug 2014 08:33:18 +0000 (16:33 +0800)

Merge remote-tracking branch 'sv/nafmo/master'

* sv/nafmo/master:
l10n: Fix more typos in the Swedish translations

l10n: git.pot: v2.1.0 round 1 (38 new, 9 removed)Jiang Xin Mon, 4 Aug 2014 06:51:24 +0000 (14:51 +0800)

l10n: git.pot: v2.1.0 round 1 (38 new, 9 removed)

Generate po/git.pot from v2.1.0-rc0 for git v2.1.0 l10n round 1.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>

l10n: Updated Bulgarian translation of git (2247t,0f,0u)Alexander Shopov Sun, 3 Aug 2014 08:16:24 +0000 (11:16 +0300)

l10n: Updated Bulgarian translation of git (2247t,0f,0u)

Used make po/git.pot from git-l10n/git-po/master

Signed-off-by: Alexander Shopov <ash@kambanaria.org>

l10n: Updated Bulgarian translation of git (2228t,0f,0u)Alexander Shopov Fri, 27 Jun 2014 12:04:51 +0000 (15:04 +0300)

l10n: Updated Bulgarian translation of git (2228t,0f,0u)

Used po/git.pot from git-l10n/git-po/master

Signed-off-by: Alexander Shopov <ash@kambanaria.org>

imap-send: clarify CRAM-MD5 vs LOGIN documentationTony Finch Thu, 31 Jul 2014 08:14:30 +0000 (09:14 +0100)

imap-send: clarify CRAM-MD5 vs LOGIN documentation

Explicitly mention that leaving imap.authMethod unset makes
git imap-send use the basic IMAP plaintext LOGIN command.

Signed-off-by: Tony Finch <dot@dotat.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-push: fix link in man pageTony Finch Thu, 31 Jul 2014 15:06:28 +0000 (16:06 +0100)

git-push: fix link in man page

Signed-off-by: Tony Finch <dot@dotat.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Sync with 2.0.4Junio C Hamano Wed, 30 Jul 2014 21:25:46 +0000 (14:25 -0700)

Sync with 2.0.4

* maint:
Git 2.0.4
commit --amend: test specifies authorship but forgets to check

Update draft release notes to 2.1Junio C Hamano Wed, 30 Jul 2014 21:25:14 +0000 (14:25 -0700)

Update draft release notes to 2.1

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'jk/more-push-completion'Junio C Hamano Wed, 30 Jul 2014 21:21:13 +0000 (14:21 -0700)

Merge branch 'jk/more-push-completion'

* jk/more-push-completion:
completion: complete `git push --force-with-lease=`
completion: add some missing options to `git push`
completion: complete "unstuck" `git push --recurse-submodules`

Merge branch 'sk/mingw-tests-workaround'Junio C Hamano Wed, 30 Jul 2014 21:21:12 +0000 (14:21 -0700)

Merge branch 'sk/mingw-tests-workaround'

Make tests pass on msysgit by mostly disabling ones that are
infeasible on that platform.

* sk/mingw-tests-workaround:
t800[12]: work around MSys limitation
t9902: mingw-specific fix for gitfile link files
t4210: skip command-line encoding tests on mingw
MinGW: disable legacy encoding tests
t0110/MinGW: skip tests that pass arbitrary bytes on the command line
MinGW: Skip test redirecting to fd 4

Merge branch 'sk/mingw-uni-fix-more'Junio C Hamano Wed, 30 Jul 2014 21:21:09 +0000 (14:21 -0700)

Merge branch 'sk/mingw-uni-fix-more'

Most of these are battle-tested in msysgit and are needed to
complete what has been merged to 'master' already.

* sk/mingw-uni-fix-more:
Win32: enable color output in Windows cmd.exe
Win32: patch Windows environment on startup
Win32: keep the environment sorted
Win32: use low-level memory allocation during initialization
Win32: reduce environment array reallocations
Win32: don't copy the environment twice when spawning child processes
Win32: factor out environment block creation
Win32: unify environment function names
Win32: unify environment case-sensitivity
Win32: fix environment memory leaks
Win32: Unicode environment (incoming)
Win32: Unicode environment (outgoing)
Revert "Windows: teach getenv to do a case-sensitive search"
tests: do not pass iso8859-1 encoded parameter

Merge branch 'ep/avoid-test-a-o'Junio C Hamano Wed, 30 Jul 2014 21:21:05 +0000 (14:21 -0700)

Merge branch 'ep/avoid-test-a-o'

* ep/avoid-test-a-o:
t9814: fix misconversion from test $a -o $b to test $a || test $b

Git 2.0.4 v2.0.4Junio C Hamano Wed, 30 Jul 2014 21:19:53 +0000 (14:19 -0700)

Git 2.0.4

Signed-off-by: Junio C Hamano <gitster@pobox.com>

pretty: make empty userformats truly emptyJeff King Tue, 29 Jul 2014 17:56:48 +0000 (13:56 -0400)

pretty: make empty userformats truly empty

If the user provides an empty format with "--format=", we
end up putting in extra whitespace that the user cannot
prevent. This comes from two places:

1. If the format is missing a terminating newline, we add
one automatically. This makes sense for --format=%h, but
not for a truly empty format.

2. We add an extra newline between the pretty-printed
format and a diff or diffstat. If the format is empty,
there's no point in doing so if there's nothing to
separate.

With this patch, one can get a diff with no other cruft out
of "diff-tree --format= $commit".

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

pretty: treat "--format=" as an empty userformatJeff King Tue, 29 Jul 2014 17:54:46 +0000 (13:54 -0400)

pretty: treat "--format=" as an empty userformat

Until now, we treated "--pretty=" or "--format=" as "give me
the default format". This was not planned nor documented,
but only what happened to work due to our parsing of
"--pretty" (which should give the default format).

Let's instead let these be an actual empty userformat.
Otherwise one must write out the annoyingly long
"--pretty=tformat:" to get the same behavior.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

revision: drop useless string offset when parsing ... Jeff King Tue, 29 Jul 2014 17:53:40 +0000 (13:53 -0400)

revision: drop useless string offset when parsing "--pretty"

Once upon a time, we parsed pretty options by looking for
"--pretty" at the start of the string, and then feeding the
rest (including an "=") to get_commit_format. Later, commit
48ded91 (log --pretty: do not accept bogus "--prettyshort",
2008-05-25) split this into a separate check for "--pretty"
versus "--pretty=".

However, when parsing "--pretty", we still passed "arg+8" to
get_commit_format. This is useless, since it will always
point to the NUL terminator at the end of the string. We can
simply pass NULL instead; both parameters are treated the
same by get_commit_format.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add documentation for writing config filesTanay Abhra Mon, 28 Jul 2014 10:42:26 +0000 (03:42 -0700)

add documentation for writing config files

Replace TODO introduced in commit 9c3c22 with documentation
explaining Git config API functions for writing configuration
files.

Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Reviewed-by: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

commit --amend: test specifies authorship but forgets... Fabian Ruch Wed, 30 Jul 2014 09:45:11 +0000 (11:45 +0200)

commit --amend: test specifies authorship but forgets to check

The test case "--amend option copies authorship" specifies that the
git-commit option `--amend` uses the authorship of the replaced
commit for the new commit. Add the omitted check that this property
actually holds.

Signed-off-by: Fabian Ruch <bafain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

use a hashmap to make remotes fasterPatrick Reynolds Tue, 29 Jul 2014 14:43:39 +0000 (14:43 +0000)

use a hashmap to make remotes faster

Remotes are stored as an array, so looking one up or adding one without
duplication is an O(n) operation. Reading an entire config file full of
remotes is O(n^2) in the number of remotes. For a repository with tens of
thousands of remotes, the running time can hit multiple minutes.

Hash tables are way faster. So we add a hashmap from remote name to
struct remote and use it for all lookups. The time to add a new remote to
a repo that already has 50,000 remotes drops from ~2 minutes to < 1
second.

We retain the old array of remotes so iterators proceed in config-file
order.

Signed-off-by: Patrick Reynolds <patrick.reynolds@github.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

test-config: add tests for the config_set APITanay Abhra Mon, 28 Jul 2014 10:10:39 +0000 (03:10 -0700)

test-config: add tests for the config_set API

Expose the `config_set` C API as a set of simple commands in order to
facilitate testing. Add tests for the `config_set` API as well as for
`git_config_get_*()` family for the usual config files.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add `config_set` API for caching config-like filesTanay Abhra Mon, 28 Jul 2014 10:10:38 +0000 (03:10 -0700)

add `config_set` API for caching config-like files

Currently `git_config()` uses a callback mechanism and file rereads for
config values. Due to this approach, it is not uncommon for the config
files to be parsed several times during the run of a git program, with
different callbacks picking out different variables useful to themselves.

Add a `config_set`, that can be used to construct an in-memory cache for
config-like files that the caller specifies (i.e., files like `.gitmodules`,
`~/.gitconfig` etc.). Add two external functions `git_configset_get_value`
and `git_configset_get_value_multi` for querying from the config sets.
`git_configset_get_value` follows `last one wins` semantic (i.e. if there
are multiple matches for the queried key in the files of the configset the
value returned will be the last entry in `value_list`).
`git_configset_get_value_multi` returns a list of values sorted in order of
increasing priority (i.e. last match will be at the end of the list). Add
type specific query functions like `git_configset_get_bool` and similar.

Add a default `config_set`, `the_config_set` to cache all key-value pairs
read from usual config files (repo specific .git/config, user wide
~/.gitconfig, XDG config and the global /etc/gitconfig). `the_config_set`
is populated using `git_config()`.

Add two external functions `git_config_get_value` and
`git_config_get_value_multi` for querying in a non-callback manner from
`the_config_set`. Also, add type specific query functions that are
implemented as a thin wrapper around the `config_set` API.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

init: avoid superfluous real_path() callsRené Scharfe Mon, 28 Jul 2014 18:42:05 +0000 (20:42 +0200)

init: avoid superfluous real_path() calls

Feeding the result of a real_path() call to real_path() again doesn't
change that result -- the returned path won't get any more real. Avoid
such a double call in set_git_dir_init() and for the same reason stop
calling real_path() before feeding paths to set_git_work_tree(), as the
latter already takes care of that.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

unix-sockets: use strbuf_getcwd()René Scharfe Mon, 28 Jul 2014 18:25:40 +0000 (20:25 +0200)

unix-sockets: use strbuf_getcwd()

Instead of using a PATH_MAX-sized buffer, which can be too small on some
file systems, use strbuf_getcwd(), which handles any path getcwd()
returns. Also preserve the errno set by strbuf_getcwd() instead of
setting it to ENAMETOOLONG; that way a more appropriate error message
can be shown based on the actual reason for failing.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

strbuf: add strbuf_getcwd()René Scharfe Mon, 28 Jul 2014 18:24:29 +0000 (20:24 +0200)

strbuf: add strbuf_getcwd()

Add strbuf_getcwd(), which puts the current working directory into a
strbuf. Because it doesn't use a fixed-size buffer it supports
arbitrarily long paths, provided the platform's getcwd() does as well.
At least on Linux and FreeBSD it handles paths longer than PATH_MAX
just fine.

Suggested-by: Karsten Blees <karsten.blees@gmail.com>
Helped-by: Duy Nguyen <pclouds@gmail.com>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'maint'Junio C Hamano Mon, 28 Jul 2014 18:31:46 +0000 (11:31 -0700)

Merge branch 'maint'

* maint:
t4013: test diff-tree's --stdin commit formatting
diff-tree: avoid lookup_unknown_object
object_as_type: set commit index
alloc: factor out commit index
add object_as_type helper for casting objects
parse_object_buffer: do not set object type
move setting of object->type to alloc_* functions
alloc: write out allocator definitions
alloc.c: remove the alloc_raw_commit_node() function

t4013: test diff-tree's --stdin commit formattingJeff King Mon, 28 Jul 2014 18:01:57 +0000 (14:01 -0400)

t4013: test diff-tree's --stdin commit formatting

Once upon a time, git-log was just "rev-list | diff-tree",
and we did not bother to test it separately. These days git-log
is implemented internally, but we want to make sure that the
rev-list to diff-tree pipeline continues to function. Let's
add a basic sanity test.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'jk/misc-fixes-maint'Junio C Hamano Mon, 28 Jul 2014 18:30:41 +0000 (11:30 -0700)

Merge branch 'jk/misc-fixes-maint'

* jk/misc-fixes-maint:
apply: avoid possible bogus pointer
fix memory leak parsing core.commentchar
transport: fix leaks in refs_from_alternate_cb
free ref string returned by dwim_ref
receive-pack: don't copy "dir" parameter

t1402: check for refs ending with a dotJeff King Mon, 28 Jul 2014 15:48:11 +0000 (11:48 -0400)

t1402: check for refs ending with a dot

This has been illegal since cbdffe4 (check_ref_format(): tighten
refname rules, 2009-03-21), but we never tested it.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Revert "Merge branch 'dt/refs-check-refname-component... Junio C Hamano Mon, 28 Jul 2014 17:41:53 +0000 (10:41 -0700)

Revert "Merge branch 'dt/refs-check-refname-component-sse'"

This reverts commit 6f92e5ff3cdc813de8ef5327fd4bad492fb7d6c9, reversing
changes made to a02ad882a17b9d45f63ea448391ac5e9f7948222.

Revert "Merge branch 'dt/refs-check-refname-component... Junio C Hamano Mon, 28 Jul 2014 17:41:16 +0000 (10:41 -0700)

Revert "Merge branch 'dt/refs-check-refname-component-sse-fix'"

This reverts commit 779c99fd68dcdaff7d996a1985914154a36a272c, reversing
changes made to df4d7d56461c19361a6f32b633e850c7ba6e55e6.

Merge branch 'jk/alloc-commit-id-maint' into maintJunio C Hamano Mon, 28 Jul 2014 17:35:35 +0000 (10:35 -0700)

Merge branch 'jk/alloc-commit-id-maint' into maint

* jk/alloc-commit-id-maint:
diff-tree: avoid lookup_unknown_object
object_as_type: set commit index
alloc: factor out commit index
add object_as_type helper for casting objects
parse_object_buffer: do not set object type
move setting of object->type to alloc_* functions
alloc: write out allocator definitions
alloc.c: remove the alloc_raw_commit_node() function

diff-tree: avoid lookup_unknown_objectJeff King Sun, 13 Jul 2014 06:42:17 +0000 (02:42 -0400)

diff-tree: avoid lookup_unknown_object

We generally want to avoid lookup_unknown_object, because it
results in allocating more memory for the object than may be
strictly necessary.

In this case, it is used to check whether we have an
already-parsed object before calling parse_object, to save
us from reading the object from disk. Using lookup_object
would be fine for that purpose, but we can take it a step
further. Since this code was written, parse_object already
learned the "check lookup_object" optimization, so we can
simply call parse_object directly.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

object_as_type: set commit indexJeff King Sun, 13 Jul 2014 06:42:12 +0000 (02:42 -0400)

object_as_type: set commit index

The point of the "index" field of struct commit is that
every allocated commit would have one. It is supposed to be
an invariant that whenever object->type is set to
OBJ_COMMIT, we have a unique index.

Commit 969eba6 (commit: push commit_index update into
alloc_commit_node, 2014-06-10) covered this case for
newly-allocated commits. However, we may also allocate an
"unknown" object via lookup_unknown_object, and only later
convert it to a commit. We must make sure that we set the
commit index when we switch the type field.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

alloc: factor out commit indexJeff King Sun, 13 Jul 2014 06:42:08 +0000 (02:42 -0400)

alloc: factor out commit index

We keep a static counter to set the commit index on newly
allocated objects. However, since we also need to set the
index on any_objects which are converted to commits, let's
make the counter available as a public function.

While we're moving it, let's make sure the counter is
allocated as an unsigned integer to match the index field in
"struct commit".

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add object_as_type helper for casting objectsJeff King Sun, 13 Jul 2014 06:42:03 +0000 (02:42 -0400)

add object_as_type helper for casting objects

When we call lookup_commit, lookup_tree, etc, the logic goes
something like:

1. Look for an existing object struct. If we don't have
one, allocate and return a new one.

2. Double check that any object we have is the expected
type (and complain and return NULL otherwise).

3. Convert an object with type OBJ_NONE (from a prior
call to lookup_unknown_object) to the expected type.

We can encapsulate steps 2 and 3 in a helper function which
checks whether we have the expected object type, converts
OBJ_NONE as appropriate, and returns the object.

Not only does this shorten the code, but it also provides
one central location for converting OBJ_NONE objects into
objects of other types. Future patches will use that to
enforce type-specific invariants.

Since this is a refactoring, we would want it to behave
exactly as the current code. It takes a little reasoning to
see that this is the case:

- for lookup_{commit,tree,etc} functions, we are just
pulling steps 2 and 3 into a function that does the same
thing.

- for the call in peel_object, we currently only do step 3
(but we want to consolidate it with the others, as
mentioned above). However, step 2 is a noop here, as the
surrounding conditional makes sure we have OBJ_NONE
(which we want to keep to avoid an extraneous call to
sha1_object_info).

- for the call in lookup_commit_reference_gently, we are
currently doing step 2 but not step 3. However, step 3
is a noop here. The object we got will have just come
from deref_tag, which must have figured out the type for
each object in order to know when to stop peeling.
Therefore the type will never be OBJ_NONE.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

parse_object_buffer: do not set object typeJeff King Sun, 13 Jul 2014 06:42:00 +0000 (02:42 -0400)

parse_object_buffer: do not set object type

The only way that "obj" can be non-NULL is if it came from
one of the lookup_* functions. These functions always ensure
that the object has the expected type (and return NULL
otherwise), so there is no need for us to set the type.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

move setting of object->type to alloc_* functionsJeff King Sun, 13 Jul 2014 06:41:55 +0000 (02:41 -0400)

move setting of object->type to alloc_* functions

The "struct object" type implements basic object
polymorphism. Individual instances are allocated as
concrete types (or as a union type that can store any
object), and a "struct object *" can be cast into its real
type after examining its "type" enum. This means it is
dangerous to have a type field that does not match the
allocation (e.g., setting the type field of a "struct blob"
to "OBJ_COMMIT" would mean that a reader might read past the
allocated memory).

In most of the current code this is not a problem; the first
thing we do after allocating an object is usually to set its
type field by passing it to create_object. However, the
virtual commits we create in merge-recursive.c do not ever
get their type set. This does not seem to have caused
problems in practice, though (presumably because we always
pass around a "struct commit" pointer and never even look at
the type).

We can fix this oversight and also make it harder for future
code to get it wrong by setting the type directly in the
object allocation functions.

This will also make it easier to fix problems with commit
index allocation, as we know that any object allocated by
alloc_commit_node will meet the invariant that an object
with an OBJ_COMMIT type field will have a unique index
number.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

alloc: write out allocator definitionsJeff King Sun, 13 Jul 2014 06:41:51 +0000 (02:41 -0400)

alloc: write out allocator definitions

Because the allocator functions for tree, blobs, etc are all
very similar, we originally used a macro to avoid repeating
ourselves. Since the prior commit, though, the heavy lifting
is done by an inline helper function. The macro does still
save us a few lines, but at some readability cost. It
obfuscates the function definitions (and makes them hard to
find via grep).

Much worse, though, is the fact that it isn't used
consistently for all allocators. Somebody coming later may
be tempted to modify DEFINE_ALLOCATOR, but they would miss
alloc_commit_node, which is treated specially.

Let's just drop the macro and write everything out
explicitly.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>