gitweb.git
PRItime: introduce a new "printf format" for timestampsJohannes Schindelin Fri, 21 Apr 2017 10:45:48 +0000 (12:45 +0200)

PRItime: introduce a new "printf format" for timestamps

Currently, Git's source code treats all timestamps as if they were
unsigned longs. Therefore, it is okay to write "%lu" when printing them.

There is a substantial problem with that, though: at least on Windows,
time_t is *larger* than unsigned long, and hence we will want to switch
away from the ill-specified `unsigned long` data type.

So let's introduce the pseudo format "PRItime" (currently simply being
defined to "lu") to make it easier to change the data type used for
timestamps.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

parse_timestamp(): specify explicitly where we parse... Johannes Schindelin Fri, 21 Apr 2017 10:45:44 +0000 (12:45 +0200)

parse_timestamp(): specify explicitly where we parse timestamps

Currently, Git's source code represents all timestamps as `unsigned
long`. In preparation for using a more appropriate data type, let's
introduce a symbol `parse_timestamp` (currently being defined to
`strtoul`) where appropriate, so that we can later easily switch to,
say, use `strtoull()` instead.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t0006 & t5000: skip "far in the future" test when time_... Johannes Schindelin Thu, 20 Apr 2017 20:58:21 +0000 (22:58 +0200)

t0006 & t5000: skip "far in the future" test when time_t is too limited

Git's source code refers to timestamps as unsigned long, which is
ill-defined, as there is no guarantee about the number of bits that
data type has.

In preparation of switching to another data type that is large enough
to hold "far in the future" dates, we need to prepare the t0006-date.sh
script for the case where we *still* cannot format those dates if the
system library uses 32-bit time_t.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t0006 & t5000: prepare for 64-bit timestampsJohannes Schindelin Thu, 20 Apr 2017 20:52:13 +0000 (22:52 +0200)

t0006 & t5000: prepare for 64-bit timestamps

Git's source code refers to timestamps as unsigned longs. On 32-bit
platforms, as well as on Windows, unsigned long is not large enough to
capture dates that are "absurdly far in the future".

It is perfectly valid by the C standard, of course, for the `long` data
type to refer to 32-bit integers. That is why the `time_t` data type
exists: so that it can be 64-bit even if `long` is 32-bit. Git's source
code simply uses an incorrect data type for timestamps, is all.

The earlier quick fix 6b9c38e14cd (t0006: skip "far in the future" test
when unsigned long is not long enough, 2016-07-11) papered over this
issue simply by skipping the respective test cases on platforms where
they would fail due to the data type in use.

This quick fix, however, tests for *long* to be 64-bit or not. What we
need, though, is a test that says whether *whatever data type we use for
timestamps* is 64-bit or not.

The same quick fix was used to handle the similar problem where Git's
source code uses `unsigned long` to represent size, instead of `size_t`,
conflating the two issues.

So let's just add another prerequisite to test specifically whether
timestamps are represented by a 64-bit data type or not. Later, after we
switch to a larger data type, we can flip that prerequisite to test
`time_t` instead of `long`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

ref-filter: avoid using `unsigned long` for catch-all... Johannes Schindelin Thu, 20 Apr 2017 20:52:09 +0000 (22:52 +0200)

ref-filter: avoid using `unsigned long` for catch-all data type

In its `atom_value` struct, the ref-filter source code wants to store
different values in a field called `ul` (for `unsigned long`), e.g.
timestamps.

However, as we are about to switch the data type of timestamps away from
`unsigned long` (because it may be 32-bit even when `time_t` is 64-bit),
that data type is not large enough.

Simply change that field to use `uintmax_t` instead.

This patch is a bit larger than the mere change of the data type
because the field's name was tied to its data type, which has been fixed
at the same time.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Git 2.13-rc0 v2.13.0-rc0Junio C Hamano Thu, 20 Apr 2017 04:42:08 +0000 (21:42 -0700)

Git 2.13-rc0

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

Merge branch 'jh/memihash-opt'Junio C Hamano Thu, 20 Apr 2017 04:37:25 +0000 (21:37 -0700)

Merge branch 'jh/memihash-opt'

Hotfix for a topic that is already in 'master'.

* jh/memihash-opt:
p0004: make perf test executable
t3008: skip lazy-init test on a single-core box
test-online-cpus: helper to return cpu count
name-hash: fix buffer overrun

Merge branch 'vn/revision-shorthand-for-side-branch... Junio C Hamano Thu, 20 Apr 2017 04:37:25 +0000 (21:37 -0700)

Merge branch 'vn/revision-shorthand-for-side-branch-log'

Doc cleanup.

* vn/revision-shorthand-for-side-branch-log:
doc/revisions: remove brackets from rev^-n shorthand

Merge branch 'sf/putty-w-args'Junio C Hamano Thu, 20 Apr 2017 04:37:24 +0000 (21:37 -0700)

Merge branch 'sf/putty-w-args'

* sf/putty-w-args:
connect.c: handle errors from split_cmdline

Merge branch 'ld/p4-current-branch-fix'Junio C Hamano Thu, 20 Apr 2017 04:37:23 +0000 (21:37 -0700)

Merge branch 'ld/p4-current-branch-fix'

"git p4" used "name-rev HEAD" when it wants to learn what branch is
checked out; it should use "symbolic-ref HEAD".

* ld/p4-current-branch-fix:
git-p4: don't use name-rev to get current branch
git-p4: add read_pipe_text() internal function
git-p4: add failing test for name-rev rather than symbolic-ref

Merge branch 'dt/gc-ignore-old-gc-logs'Junio C Hamano Thu, 20 Apr 2017 04:37:22 +0000 (21:37 -0700)

Merge branch 'dt/gc-ignore-old-gc-logs'

* dt/gc-ignore-old-gc-logs:
t6500: wait for detached auto gc at the end of the test script

Merge branch 'bw/attr-pathspec'Junio C Hamano Thu, 20 Apr 2017 04:37:21 +0000 (21:37 -0700)

Merge branch 'bw/attr-pathspec'

* bw/attr-pathspec:
pathspec: fix segfault in clear_pathspec

Merge branch 'ab/grep-plug-pathspec-leak'Junio C Hamano Thu, 20 Apr 2017 04:37:21 +0000 (21:37 -0700)

Merge branch 'ab/grep-plug-pathspec-leak'

Call clear_pathspec() to release resources immediately before the
cmd_grep() function returns.

* ab/grep-plug-pathspec-leak:
grep: plug a trivial memory leak

Merge branch 'jk/no-looking-at-dotgit-outside-repo'Junio C Hamano Thu, 20 Apr 2017 04:37:20 +0000 (21:37 -0700)

Merge branch 'jk/no-looking-at-dotgit-outside-repo'

Clean up fallouts from recent tightening of the set-up sequence,
where Git barfs when repository information is accessed without
first ensuring that it was started in a repository.

* jk/no-looking-at-dotgit-outside-repo:
test-read-cache: setup git dir
has_sha1_file: don't bother if we are not in a repository

Merge branch 'nd/files-backend-git-dir'Junio C Hamano Thu, 20 Apr 2017 04:37:19 +0000 (21:37 -0700)

Merge branch 'nd/files-backend-git-dir'

The "submodule" specific field in the ref_store structure is
replaced with a more generic "gitdir" that can later be used also
when dealing with ref_store that represents the set of refs visible
from the other worktrees.

* nd/files-backend-git-dir: (28 commits)
refs.h: add a note about sorting order of for_each_ref_*
t1406: new tests for submodule ref store
t1405: some basic tests on main ref store
t/helper: add test-ref-store to test ref-store functions
refs: delete pack_refs() in favor of refs_pack_refs()
files-backend: avoid ref api targeting main ref store
refs: new transaction related ref-store api
refs: add new ref-store api
refs: rename get_ref_store() to get_submodule_ref_store() and make it public
files-backend: replace submodule_allowed check in files_downcast()
refs: move submodule code out of files-backend.c
path.c: move some code out of strbuf_git_path_submodule()
refs.c: make get_main_ref_store() public and use it
refs.c: kill register_ref_store(), add register_submodule_ref_store()
refs.c: flatten get_ref_store() a bit
refs: rename lookup_ref_store() to lookup_submodule_ref_store()
refs.c: introduce get_main_ref_store()
files-backend: remove the use of git_path()
files-backend: add and use files_ref_path()
files-backend: add and use files_reflog_path()
...

Merge branch 'bw/submodule-is-active'Junio C Hamano Thu, 20 Apr 2017 04:37:18 +0000 (21:37 -0700)

Merge branch 'bw/submodule-is-active'

Error message fix.

* bw/submodule-is-active:
submodule--helper: fix typo in is_active error message

Merge branch 'va/i18n-perl-scripts'Junio C Hamano Thu, 20 Apr 2017 04:37:17 +0000 (21:37 -0700)

Merge branch 'va/i18n-perl-scripts'

Message fix.

* va/i18n-perl-scripts:
git-add--interactive.perl: add missing dot in a message

Merge branch 'sb/submodule-rm-absorb'Junio C Hamano Thu, 20 Apr 2017 04:37:17 +0000 (21:37 -0700)

Merge branch 'sb/submodule-rm-absorb'

Error message fix.

* sb/submodule-rm-absorb:
submodule.c: add missing ' in error messages

Merge branch 'ah/diff-files-ours-theirs-doc'Junio C Hamano Thu, 20 Apr 2017 04:37:16 +0000 (21:37 -0700)

Merge branch 'ah/diff-files-ours-theirs-doc'

The diff options "--ours", "--theirs" exist for quite some time.
But so far they were not documented. Now they are.

* ah/diff-files-ours-theirs-doc:
diff-files: document --ours etc.

Merge branch 'lt/mailinfo-in-body-header-continuation'Junio C Hamano Thu, 20 Apr 2017 04:37:15 +0000 (21:37 -0700)

Merge branch 'lt/mailinfo-in-body-header-continuation'

If a patch e-mail had its first paragraph after an in-body header
indented (even after a blank line after the in-body header line),
the indented line was mistook as a continuation of the in-body
header. This has been fixed.

* lt/mailinfo-in-body-header-continuation:
mailinfo: fix in-body header continuations

Merge branch 'bw/push-options-recursively-to-submodules'Junio C Hamano Thu, 20 Apr 2017 04:37:14 +0000 (21:37 -0700)

Merge branch 'bw/push-options-recursively-to-submodules'

"git push --recurse-submodules --push-option=<string>" learned to
propagate the push option recursively down to pushes in submodules.

* bw/push-options-recursively-to-submodules:
push: propagate remote and refspec with --recurse-submodules
submodule--helper: add push-check subcommand
remote: expose parse_push_refspec function
push: propagate push-options with --recurse-submodules
push: unmark a local variable as static

Merge branch 'bc/object-id'Junio C Hamano Thu, 20 Apr 2017 04:37:13 +0000 (21:37 -0700)

Merge branch 'bc/object-id'

Conversion from unsigned char [40] to struct object_id continues.

* bc/object-id:
Documentation: update and rename api-sha1-array.txt
Rename sha1_array to oid_array
Convert sha1_array_for_each_unique and for_each_abbrev to object_id
Convert sha1_array_lookup to take struct object_id
Convert remaining callers of sha1_array_lookup to object_id
Make sha1_array_append take a struct object_id *
sha1-array: convert internal storage for struct sha1_array to object_id
builtin/pull: convert to struct object_id
submodule: convert check_for_new_submodule_commits to object_id
sha1_name: convert disambiguate_hint_fn to take object_id
sha1_name: convert struct disambiguate_state to object_id
test-sha1-array: convert most code to struct object_id
parse-options-cb: convert sha1_array_append caller to struct object_id
fsck: convert init_skiplist to struct object_id
builtin/receive-pack: convert portions to struct object_id
builtin/pull: convert portions to struct object_id
builtin/diff: convert to struct object_id
Convert GIT_SHA1_RAWSZ used for allocation to GIT_MAX_RAWSZ
Convert GIT_SHA1_HEXSZ used for allocation to GIT_MAX_HEXSZ
Define new hash-size constants for allocating memory

Merge branch 'sb/submodule-short-status'Junio C Hamano Thu, 20 Apr 2017 04:37:12 +0000 (21:37 -0700)

Merge branch 'sb/submodule-short-status'

The output from "git status --short" has been extended to show
various kinds of dirtyness in submodules differently; instead of to
"M" for modified, 'm' and '?' can be shown to signal changes only
to the working tree of the submodule but not the commit that is
checked out.

* sb/submodule-short-status:
submodule.c: correctly handle nested submodules in is_submodule_modified
short status: improve reporting for submodule changes
submodule.c: stricter checking for submodules in is_submodule_modified
submodule.c: port is_submodule_modified to use porcelain 2
submodule.c: convert is_submodule_modified to use strbuf_getwholeline
submodule.c: factor out early loop termination in is_submodule_modified
submodule.c: use argv_array in is_submodule_modified

p0004: make perf test executableChristian Couder Tue, 18 Apr 2017 14:24:07 +0000 (16:24 +0200)

p0004: make perf test executable

It looks like in 89c3b0ad43 (name-hash: add perf test for lazy_init_name_hash,
2017-03-23) p0004 was not created with the execute unix rights.
Let's fix that.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Acked-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

doc/revisions: remove brackets from rev^-n shorthandKyle Meyer Sun, 16 Apr 2017 04:07:57 +0000 (00:07 -0400)

doc/revisions: remove brackets from rev^-n shorthand

Given that other instances of "{...}" in the revision documentation
represent literal characters of revision specifications, describing
the rev^-n shorthand as "<rev>^-{<n>}" incorrectly suggests that
something like "master^-{1}" is an acceptable form.

Signed-off-by: Kyle Meyer <kyle@kyleam.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Twelfth batch for 2.13Junio C Hamano Mon, 17 Apr 2017 06:30:49 +0000 (23:30 -0700)

Twelfth batch for 2.13

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

Merge branch 'js/difftool-builtin'Junio C Hamano Mon, 17 Apr 2017 06:29:34 +0000 (23:29 -0700)

Merge branch 'js/difftool-builtin'

Code cleanup.

* js/difftool-builtin:
difftool: fix use-after-free
difftool: avoid strcpy

Merge branch 'sb/unpack-trees-would-lose-submodule... Junio C Hamano Mon, 17 Apr 2017 06:29:34 +0000 (23:29 -0700)

Merge branch 'sb/unpack-trees-would-lose-submodule-message-update'

Update an error message.

* sb/unpack-trees-would-lose-submodule-message-update:
unpack-trees.c: align submodule error message to the other error messages

Merge branch 'ab/regen-perl-mak-with-different-perl'Junio C Hamano Mon, 17 Apr 2017 06:29:33 +0000 (23:29 -0700)

Merge branch 'ab/regen-perl-mak-with-different-perl'

Update the build dependency so that an update to /usr/bin/perl
etc. result in recomputation of perl.mak file.

* ab/regen-perl-mak-with-different-perl:
perl: regenerate perl.mak if perl -V changes

Merge branch 'sb/show-diff-for-submodule-in-diff-fix'Junio C Hamano Mon, 17 Apr 2017 06:29:32 +0000 (23:29 -0700)

Merge branch 'sb/show-diff-for-submodule-in-diff-fix'

"git diff --submodule=diff" learned to work better in a project
with a submodule that in turn has its own submodules.

* sb/show-diff-for-submodule-in-diff-fix:
diff: submodule inline diff to initialize env array.

Merge branch 'qp/bisect-docfix'Junio C Hamano Mon, 17 Apr 2017 06:29:31 +0000 (23:29 -0700)

Merge branch 'qp/bisect-docfix'

Doc update.

* qp/bisect-docfix:
git-bisect.txt: add missing word

Merge branch 'mm/ls-files-s-doc'Junio C Hamano Mon, 17 Apr 2017 06:29:30 +0000 (23:29 -0700)

Merge branch 'mm/ls-files-s-doc'

Doc update.

* mm/ls-files-s-doc:
Documentation: document elements in "ls-files -s" output in order

Merge branch 'jk/loose-object-info-report-error'Junio C Hamano Mon, 17 Apr 2017 06:29:30 +0000 (23:29 -0700)

Merge branch 'jk/loose-object-info-report-error'

Update error handling for codepath that deals with corrupt loose
objects.

* jk/loose-object-info-report-error:
index-pack: detect local corruption in collision check
sha1_loose_object_info: return error for corrupted objects

Merge branch 'jc/bs-t-is-not-a-tab-for-sed'Junio C Hamano Mon, 17 Apr 2017 06:29:28 +0000 (23:29 -0700)

Merge branch 'jc/bs-t-is-not-a-tab-for-sed'

Code cleanup.

* jc/bs-t-is-not-a-tab-for-sed:
contrib/git-resurrect.sh: do not write \t for HT in sed scripts

Merge branch 'jc/unused-symbols'Junio C Hamano Mon, 17 Apr 2017 06:29:27 +0000 (23:29 -0700)

Merge branch 'jc/unused-symbols'

Code cleanup.

* jc/unused-symbols:
remote.[ch]: parse_push_cas_option() can be static

Merge branch 'jk/snprintf-cleanups'Junio C Hamano Mon, 17 Apr 2017 06:29:26 +0000 (23:29 -0700)

Merge branch 'jk/snprintf-cleanups'

Code clean-up.

* jk/snprintf-cleanups:
daemon: use an argv_array to exec children
gc: replace local buffer with git_path
transport-helper: replace checked snprintf with xsnprintf
convert unchecked snprintf into xsnprintf
combine-diff: replace malloc/snprintf with xstrfmt
replace unchecked snprintf calls with heap buffers
receive-pack: print --pack-header directly into argv array
name-rev: replace static buffer with strbuf
create_branch: use xstrfmt for reflog message
create_branch: move msg setup closer to point of use
avoid using mksnpath for refs
avoid using fixed PATH_MAX buffers for refs
fetch: use heap buffer to format reflog
tag: use strbuf to format tag header
diff: avoid fixed-size buffer for patch-ids
odb_mkstemp: use git_path_buf
odb_mkstemp: write filename into strbuf
do not check odb_mkstemp return value for errors

git-p4: don't use name-rev to get current branchLuke Diamand Sat, 15 Apr 2017 10:36:09 +0000 (11:36 +0100)

git-p4: don't use name-rev to get current branch

git-p4 was using "git name-rev" to find out the current branch.

That is not safe, since if multiple branches or tags point at
the same revision, the result obtained might not be what is
expected.

Instead use "git symbolic-ref".

Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-p4: add read_pipe_text() internal functionLuke Diamand Sat, 15 Apr 2017 10:36:08 +0000 (11:36 +0100)

git-p4: add read_pipe_text() internal function

The existing read_pipe() function returns an empty string on
error, but also returns an empty string if the command returns
an empty string.

This leads to ugly constructions trying to detect error cases.

Add read_pipe_text() which just returns None on error.

Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-p4: add failing test for name-rev rather than symbo... Luke Diamand Sat, 15 Apr 2017 10:36:07 +0000 (11:36 +0100)

git-p4: add failing test for name-rev rather than symbolic-ref

Using name-rev to find the current git branch means that git-p4
does not correctly get the current branch name if there are
multiple branches pointing at HEAD, or a tag.

This change adds a test case which demonstrates the problem.
Configuring which branches are allowed to be submitted from goes
wrong, as git-p4 gets confused about which branch is in use.

This appears to be the only place that git-p4 actually cares
about the current branch.

Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

test-read-cache: setup git dirRené Scharfe Thu, 6 Apr 2017 20:41:41 +0000 (22:41 +0200)

test-read-cache: setup git dir

b1ef400e (setup_git_env: avoid blind fall-back to ".git") made programs
that tried to access a repository without initializing properly die with
a diagnostic message. One offender is test-read-cache, which is used in
p0002. Fix it by calling setup_git_directory() before accessing the
index.

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

t6500: wait for detached auto gc at the end of the... SZEDER Gábor Thu, 13 Apr 2017 10:31:38 +0000 (12:31 +0200)

t6500: wait for detached auto gc at the end of the test script

The last test in 't6500-gc', 'background auto gc does not run if
gc.log is present and recent but does if it is old', added in
a831c06a2 (gc: ignore old gc.log files, 2017-02-10), may sporadically
trigger an error message from the test harness:

rm: cannot remove 'trash directory.t6500-gc/.git/objects': Directory not empty

The test in question ends with executing an auto gc in the backround,
which occasionally takes so long that it's still running when
'test_done' is about to remove the trash directory. This 'rm -rf
$trash' in the foreground might race with the detached auto gc to
create and delete files and directories, and gc might (re-)create a
path that 'rm' already visited and removed, triggering the above error
message when 'rm' attempts to remove its parent directory.

Commit bb05510e5 (t5510: run auto-gc in the foreground, 2016-05-01)
fixed the same problem in a different test script by simply
disallowing background gc. Unfortunately, what worked there is not
applicable here, because the purpose of this test is to check the
behavior of a detached auto gc.

Make sure that the test doesn't continue before the gc is finished in
the background with a clever bit of shell trickery:

- Open fd 9 in the shell, to be inherited by the background gc
process, because our daemonize() only closes the standard fds 0,
1 and 2.
- Duplicate this fd 9 to stdout.
- Read 'git gc's stdout, and thus fd 9, through a command
substitution. We don't actually care about gc's output, but this
construct has two useful properties:
- This read blocks until stdout or fd 9 are open. While stdout is
closed after the main gc process creates the background process
and exits, fd 9 remains open until the backround process exits.
- The variable assignment from the command substitution gets its
exit status from the command executed within the command
substitution, i.e. a failing main gc process will cause the test
to fail.

Note, that this fd trickery doesn't work on Windows, because due to
MSYS limitations the git process only inherits the standard fds 0, 1
and 2 from the shell. Luckily, it doesn't matter in this case,
because on Windows daemonize() is basically a noop, thus 'git gc
--auto' always runs in the foreground.

And since we can now continue the test reliably after the detached gc
finished, check that there is only a single packfile left at the end,
i.e. that the detached gc actually did what it was supposed to do.
Also add a comment at the end of the test script to warn developers of
future tests about this issue of long running detached gc processes.

Helped-by: Jeff King <peff@peff.net>
Helped-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

pathspec: fix segfault in clear_pathspecBrandon Williams Fri, 7 Apr 2017 19:29:19 +0000 (12:29 -0700)

pathspec: fix segfault in clear_pathspec

In 'clear_pathspec()' the incorrect index parameter is used to bound an
inner-loop which is used to free a 'struct attr_match' value field.
Using the incorrect index parameter (in addition to being incorrect)
occasionally causes segmentation faults when attempting to free an
invalid pointer. Fix this by using the correct index parameter 'i'.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

grep: plug a trivial memory leakÆvar Arnfjörð Bjarmason Sun, 9 Apr 2017 19:59:00 +0000 (19:59 +0000)

grep: plug a trivial memory leak

Change the cleanup phase for the grep command to free the pathspec
struct that's allocated earlier in the same block, and used just a few
lines earlier.

With "grep hi README.md" valgrind reports a loss of 239 bytes now,
down from 351.

The relevant --num-callers=40 --leak-check=full --show-leak-kinds=all
backtrace is:

[...] 187 (112 direct, 75 indirect) bytes in 1 blocks are definitely lost in loss record 70 of 110
[...] at 0x4C2BBAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
[...] by 0x60B339: do_xmalloc (wrapper.c:59)
[...] by 0x60B2F6: xmalloc (wrapper.c:86)
[...] by 0x576B37: parse_pathspec (pathspec.c:652)
[...] by 0x4519F0: cmd_grep (grep.c:1215)
[...] by 0x4062EF: run_builtin (git.c:371)
[...] by 0x40544D: handle_builtin (git.c:572)
[...] by 0x4060A2: run_argv (git.c:624)
[...] by 0x4051C6: cmd_main (git.c:701)
[...] by 0x4C5901: main (common-main.c:43)

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Acked-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

connect.c: handle errors from split_cmdlineJeff King Tue, 11 Apr 2017 00:30:23 +0000 (20:30 -0400)

connect.c: handle errors from split_cmdline

Commit e9d9a8a4d (connect: handle putty/plink also in
GIT_SSH_COMMAND, 2017-01-02) added a call to
split_cmdline(), but checks only for a non-zero return to
see if we got any output. Since the function returns
negative values (and a NULL argv) on error, we end up
dereferencing NULL and segfaulting.

Arguably we could report on the parsing error here, but it's
probably not worth it. This is a best-effort attempt to see
if we are using plink. So we can simply return here with
"no, it wasn't plink" and let the shell actually complain
about the bogus quoting.

Reported-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

refs.h: add a note about sorting order of for_each_ref_*Nguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:41 +0000 (09:42 +0700)

refs.h: add a note about sorting order of for_each_ref_*

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

t1406: new tests for submodule ref storeNguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:40 +0000 (09:42 +0700)

t1406: new tests for submodule ref store

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

t1405: some basic tests on main ref storeNguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:39 +0000 (09:42 +0700)

t1405: some basic tests on main ref store

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

t/helper: add test-ref-store to test ref-store functionsNguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:38 +0000 (09:42 +0700)

t/helper: add test-ref-store to test ref-store functions

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

refs: delete pack_refs() in favor of refs_pack_refs()Nguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:37 +0000 (09:42 +0700)

refs: delete pack_refs() in favor of refs_pack_refs()

It only has one caller, not worth keeping just for convenience.

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

files-backend: avoid ref api targeting main ref storeNguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:36 +0000 (09:42 +0700)

files-backend: avoid ref api targeting main ref store

A small step towards making files-backend work as a non-main ref store
using the newly added store-aware API.

For the record, `join` and `nm` on refs.o and files-backend.o tell me
that files-backend no longer uses functions that default to
get_main_ref_store().

I'm not yet comfortable at the idea of removing
files_assert_main_repository() (or converting REF_STORE_MAIN to
REF_STORE_WRITE). More staring and testing is required before that can
happen. Well, except peel_ref(). I'm pretty sure that function is safe.

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

refs: new transaction related ref-store apiNguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:35 +0000 (09:42 +0700)

refs: new transaction related ref-store api

The transaction struct now takes a ref store at creation and will
operate on that ref store alone.

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

refs: add new ref-store apiNguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:34 +0000 (09:42 +0700)

refs: add new ref-store api

This is not meant to cover all existing API. It adds enough to test ref
stores with the new test program test-ref-store, coming soon and to be
used by files-backend.c.

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

refs: rename get_ref_store() to get_submodule_ref_store... Nguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:33 +0000 (09:42 +0700)

refs: rename get_ref_store() to get_submodule_ref_store() and make it public

This function is intended to replace *_submodule() refs API. It provides
a ref store for a specific submodule, which can be operated on by a new
set of refs API.

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

files-backend: replace submodule_allowed check in files... Nguyễn Thái Ngọc Duy Sun, 26 Mar 2017 02:42:32 +0000 (09:42 +0700)

files-backend: replace submodule_allowed check in files_downcast()

files-backend.c is unlearning submodules. Instead of having a specific
check for submodules to see what operation is allowed, files backend
now takes a set of flags at init. Each operation will check if the
required flags is present before performing.

For now we have four flags: read, write and odb access. Main ref store
has all flags, obviously, while submodule stores are read-only and have
access to odb (*).

The "main" flag stays because many functions in the backend calls
frontend ones without a ref store, so these functions always target the
main ref store. Ideally the flag should be gone after ref-store-aware
api is in place and used by backends.

(*) Submodule code needs for_each_ref. Try take REF_STORE_ODB flag
out. At least t3404 would fail. The "have access to odb" in submodule is
a bit hacky since we don't know from he whether add_submodule_odb() has
been called.

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

has_sha1_file: don't bother if we are not in a repositoryJonathan Nieder Tue, 11 Apr 2017 22:47:13 +0000 (15:47 -0700)

has_sha1_file: don't bother if we are not in a repository

Most callers to this function already require that they are in a
git repository, but there is an exception: "git apply" uses
has_sha1_file to avoid work if the result of applying a binary
patch is already present in the repository. When run outside any
repository, this produces an error:

fatal: BUG: setup_git_env called without repository

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

submodule--helper: fix typo in is_active error messageStefan Beller Thu, 13 Apr 2017 22:08:54 +0000 (15:08 -0700)

submodule--helper: fix typo in is_active error message

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

git-add--interactive.perl: add missing dot in a messageRalf Thielow Thu, 13 Apr 2017 16:41:12 +0000 (18:41 +0200)

git-add--interactive.perl: add missing dot in a message

One message appears twice in the translations and the only
difference is a dot at the end. So add this dot to make
the messages being identical.

Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

submodule.c: add missing ' in error messagesRalf Thielow Thu, 13 Apr 2017 16:40:45 +0000 (18:40 +0200)

submodule.c: add missing ' in error messages

Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Acked-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

difftool: fix use-after-freeJohannes Schindelin Thu, 13 Apr 2017 19:21:58 +0000 (21:21 +0200)

difftool: fix use-after-free

The left and right base directories were pointed to the buf field of
two strbufs, which were subject to change.

A contrived test case shows the problem where a file with a long enough
name to force the strbuf to grow is up-to-date (hence the code path is
used where the work tree's version of the file is reused), and then a
file that is not up-to-date needs to be written (hence the code path is
used where checkout_entry() uses the previously recorded base_dir that
is invalid by now).

Let's just copy the base_dir strings for use with checkout_entry(),
never touch them until the end, and release them then. This is an easily
verifiable fix (as opposed to the next-obvious alternative: to re-set
base_dir after every loop iteration).

This fixes https://github.com/git-for-windows/git/issues/1124

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

diff-files: document --ours etc.Andreas Heiduk Tue, 11 Apr 2017 14:39:50 +0000 (16:39 +0200)

diff-files: document --ours etc.

git-diff understands "--ours", "--theirs" and "--base" for files with
conflicts. But so far they were not documented for the central diff
command but only for diff-files.

Signed-off-by: Andreas Heiduk <asheiduk@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t3008: skip lazy-init test on a single-core boxKevin Willford Mon, 3 Apr 2017 15:16:42 +0000 (15:16 +0000)

t3008: skip lazy-init test on a single-core box

The lazy-init codepath will not be exercised uniless threaded. Skip
the entire test on a single-core box. Also replace a hard-coded
constant of 2000 (number of cache entries to manifacture for tests)
with a variable with a human readable name.

Signed-off-by: Kevin Willford <kewillf@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

test-online-cpus: helper to return cpu countJeff Hostetler Mon, 3 Apr 2017 15:16:41 +0000 (15:16 +0000)

test-online-cpus: helper to return cpu count

Created helper executable to print the value of online_cpus()
allowing multi-threaded tests to be skipped when appropriate.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

mailinfo: fix in-body header continuationsLinus Torvalds Sat, 1 Apr 2017 19:14:39 +0000 (12:14 -0700)

mailinfo: fix in-body header continuations

An empty line should stop any pending in-body headers, and start the
actual body parsing.

This also modifies the original test for the in-body headers to actually
have a real commit body that starts with spaces, and changes the test to
check that the long line matches _exactly_, and doesn't get extra data
from the body.

Fixes:6b4b013f1884 ("mailinfo: handle in-body header continuations")
Cc: Jonathan Tan <jonathantanmy@google.com>
Cc: Jeff King <peff@peff.net>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

push: propagate remote and refspec with --recurse-submo... Brandon Williams Wed, 5 Apr 2017 17:47:19 +0000 (10:47 -0700)

push: propagate remote and refspec with --recurse-submodules

Teach "push --recurse-submodules" to propagate, if given a name as remote, the
provided remote and refspec recursively to the pushes performed in the
submodules. The push will therefore only succeed if all submodules have a
remote with such a name configured.

Note that "push --recurse-submodules" with a path or URL as remote will not
propagate the remote or refspec and instead use the default remote and refspec
configured in the submodule, preserving the current behavior.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

submodule--helper: add push-check subcommandBrandon Williams Wed, 5 Apr 2017 17:47:18 +0000 (10:47 -0700)

submodule--helper: add push-check subcommand

Add the 'push-check' subcommand to submodule--helper which is used to
check if the provided remote and refspec can be used as part of a push
operation in the submodule.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

remote: expose parse_push_refspec functionBrandon Williams Wed, 5 Apr 2017 17:47:17 +0000 (10:47 -0700)

remote: expose parse_push_refspec function

A future patch needs access to the 'parse_push_refspec()' function so
let's export the function so other modules can use it.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

push: propagate push-options with --recurse-submodulesBrandon Williams Wed, 5 Apr 2017 17:47:16 +0000 (10:47 -0700)

push: propagate push-options with --recurse-submodules

Teach push --recurse-submodules to propagate push-options recursively to
the pushes performed in the submodules.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Eleventh batch for 2.13Junio C Hamano Tue, 11 Apr 2017 07:27:05 +0000 (00:27 -0700)

Eleventh batch for 2.13

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

Merge branch 'ls/travis-relays-for-windows-ci'Junio C Hamano Tue, 11 Apr 2017 07:21:52 +0000 (00:21 -0700)

Merge branch 'ls/travis-relays-for-windows-ci'

Define a new task in .travis.yml that triggers a test session on
Windows run elsewhere.

* ls/travis-relays-for-windows-ci:
travis-ci: build and test Git on Windows

Merge branch 'cc/untracked'Junio C Hamano Tue, 11 Apr 2017 07:21:51 +0000 (00:21 -0700)

Merge branch 'cc/untracked'

Code cleanup.

* cc/untracked:
update-index: fix xgetcwd() related memory leak

Merge branch 'ah/log-decorate-default-to-auto'Junio C Hamano Tue, 11 Apr 2017 07:21:51 +0000 (00:21 -0700)

Merge branch 'ah/log-decorate-default-to-auto'

The default behaviour of "git log" in an interactive session has
been changed to enable "--decorate".

* ah/log-decorate-default-to-auto:
log: if --decorate is not given, default to --decorate=auto

Merge branch 'ab/ref-filter-no-contains'Junio C Hamano Tue, 11 Apr 2017 07:21:50 +0000 (00:21 -0700)

Merge branch 'ab/ref-filter-no-contains'

"git tag/branch/for-each-ref" family of commands long allowed to
filter the refs by "--contains X" (show only the refs that are
descendants of X), "--merged X" (show only the refs that are
ancestors of X), "--no-merged X" (show only the refs that are not
ancestors of X). One curious omission, "--no-contains X" (show
only the refs that are not descendants of X) has been added to
them.

* ab/ref-filter-no-contains:
tag: add tests for --with and --without
ref-filter: reflow recently changed branch/tag/for-each-ref docs
ref-filter: add --no-contains option to tag/branch/for-each-ref
tag: change --point-at to default to HEAD
tag: implicitly supply --list given another list-like option
tag: change misleading --list <pattern> documentation
parse-options: add OPT_NONEG to the "contains" option
tag: add more incompatibles mode tests
for-each-ref: partly change <object> to <commit> in help
tag tests: fix a typo in a test description
tag: remove a TODO item from the test suite
ref-filter: add test for --contains on a non-commit
ref-filter: make combining --merged & --no-merged an error
tag doc: reword --[no-]merged to talk about commits, not tips
tag doc: split up the --[no-]merged documentation
tag doc: move the description of --[no-]merged earlier

diff: submodule inline diff to initialize env array.Stefan Beller Fri, 31 Mar 2017 23:17:32 +0000 (16:17 -0700)

diff: submodule inline diff to initialize env array.

David reported:
> When I try to run `git diff --submodule=diff` in a submodule which has
> it's own submodules that have changes I get the error: fatal: bad
> object.

This happens, because we do not properly initialize the environment
in which the diff is run in the submodule. That means we inherit the
environment from the main process, which sets environment variables.
(Apparently we do set environment variables which we do not set
when not in a submodules, i.e. the .git directory is linked)

This commit, just like fd47ae6a5b (diff: teach diff to display
submodule difference with an inline diff, 2016-08-31) introduces bad
test code (i.e. hard coded hash values), which will be cleanup up in
a later patch.

Reported-by: David Parrish <daveparrish@gmail.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

push: unmark a local variable as staticBrandon Williams Fri, 31 Mar 2017 23:56:22 +0000 (16:56 -0700)

push: unmark a local variable as static

There isn't any obvious reason for the 'struct string_list push_options'
and 'struct string_list_item *item' to be marked as static, so unmark
them as being static. Also, clear the push_options string_list to
prevent memory leaking.

Signed-off-by: Brandon Williams <bmwill@google.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-bisect.txt: add missing wordQuentin Pradet Sat, 1 Apr 2017 06:40:56 +0000 (10:40 +0400)

git-bisect.txt: add missing word

Signed-off-by: Quentin Pradet <quentin.pradet@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: document elements in "ls-files -s" outpu... Mostyn Bramley-Moore Sat, 1 Apr 2017 07:08:25 +0000 (09:08 +0200)

Documentation: document elements in "ls-files -s" output in order

List the fields in order of appearance in the command output.

Signed-off-by: Mostyn Bramley-Moore <mostyn@antipode.se>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

index-pack: detect local corruption in collision checkJeff King Sat, 1 Apr 2017 08:09:32 +0000 (04:09 -0400)

index-pack: detect local corruption in collision check

When we notice that we have a local copy of an incoming
object, we compare the two objects to make sure we haven't
found a collision. Before we get to the actual object
bytes, though, we compare the type and size from
sha1_object_info().

If our local object is corrupted, then the type will be
OBJ_BAD, which obviously will not match the incoming type,
and we'll report "SHA1 COLLISION FOUND" (with capital
letters and everything). This is confusing, as the problem
is not a collision but rather local corruption. We should
report that instead (just like we do if reading the rest of
the object content fails a few lines later).

Note that we _could_ just ignore the error and mark it as a
non-collision. That would let you "git fetch" to replace a
corrupted object. But it's not a very reliable method for
repairing a repository. The earlier want/have negotiation
tries to get the other side to omit objects we already have,
and it would not realize that we are "missing" this
corrupted object. So we're better off complaining loudly
when we see corruption, and letting the user take more
drastic measures to repair (like making a full clone
elsewhere and copying the pack into place).

Note that the test sets transfer.unpackLimit in the
receiving repository so that we use index-pack (which is
what does the collision check). Normally for such a small
push we'd use unpack-objects, which would simply try to
write the loose object, and discard the new one when we see
that there's already an old one.

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

sha1_loose_object_info: return error for corrupted... Jeff King Sat, 1 Apr 2017 08:05:21 +0000 (04:05 -0400)

sha1_loose_object_info: return error for corrupted objects

When sha1_loose_object_info() finds that a loose object file
cannot be stat(2)ed or mmap(2)ed, it returns -1 to signal an
error to the caller. However, if it found that the loose
object file is corrupt and the object data cannot be used
from it, it stuffs OBJ_BAD into "type" field of the
object_info, but returns zero (i.e., success), which can
confuse callers.

This is due to 052fe5eac (sha1_loose_object_info: make type
lookup optional, 2013-07-12), which switched the return to a
strict success/error, rather than returning the type (but
botched the return).

Callers of regular sha1_object_info() don't notice the
difference, as that function returns the type (which is
OBJ_BAD in this case). However, direct callers of
sha1_object_info_extended() see the function return success,
but without setting any meaningful values in the object_info
struct, leading them to access potentially uninitialized
memory.

The easiest way to see the bug is via "cat-file -s", which
will happily ignore the corruption and report whatever
value happened to be in the "size" variable.

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

contrib/git-resurrect.sh: do not write \t for HT in... Junio C Hamano Sat, 1 Apr 2017 04:08:30 +0000 (21:08 -0700)

contrib/git-resurrect.sh: do not write \t for HT in sed scripts

Just like we did in 0d1d6e50 ("t/t7003: replace \t with literal tab
in sed expression", 2010-08-12), avoid writing "\t" for HT in sed
scripts, which is not portable.

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

name-hash: fix buffer overrunKevin Willford Fri, 31 Mar 2017 17:32:14 +0000 (17:32 +0000)

name-hash: fix buffer overrun

Add check for the end of the entries for the thread partition.
Add test for lazy init name hash with specific directory structure

The lazy init hash name was causing a buffer overflow when the last
entry in the index was multiple folder deep with parent folders that
did not have any files in them.

This adds a test for the boundary condition of the thread partitions
with the folder structure that was triggering the buffer overflow.

The fix was to check if it is the last entry for the thread partition
in the handle_range_dir and not try to use the next entry in the cache.

Signed-off-by: Kevin Willford <kewillf@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

remote.[ch]: parse_push_cas_option() can be staticJunio C Hamano Fri, 31 Mar 2017 20:20:48 +0000 (13:20 -0700)

remote.[ch]: parse_push_cas_option() can be static

Since 068c77a5 ("builtin/send-pack.c: use parse_options API",
2015-08-19), there is no external user of this helper function.

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

Documentation: update and rename api-sha1-array.txtbrian m. carlson Fri, 31 Mar 2017 01:40:01 +0000 (01:40 +0000)

Documentation: update and rename api-sha1-array.txt

Since the structure and functions have changed names, update the code
examples and the documentation. Rename the file to match the new name
of the API.

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

Rename sha1_array to oid_arraybrian m. carlson Fri, 31 Mar 2017 01:40:00 +0000 (01:40 +0000)

Rename sha1_array to oid_array

Since this structure handles an array of object IDs, rename it to struct
oid_array. Also rename the accessor functions and the initialization
constant.

This commit was produced mechanically by providing non-Documentation
files to the following Perl one-liners:

perl -pi -E 's/struct sha1_array/struct oid_array/g'
perl -pi -E 's/\bsha1_array_/oid_array_/g'
perl -pi -E 's/SHA1_ARRAY_INIT/OID_ARRAY_INIT/g'

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

Convert sha1_array_for_each_unique and for_each_abbrev... brian m. carlson Fri, 31 Mar 2017 01:39:59 +0000 (01:39 +0000)

Convert sha1_array_for_each_unique and for_each_abbrev to object_id

Make sha1_array_for_each_unique take a callback using struct object_id.
Since one of these callbacks is an argument to for_each_abbrev, convert
those as well. Rename various functions, replacing "sha1" with "oid".

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

Convert sha1_array_lookup to take struct object_idbrian m. carlson Fri, 31 Mar 2017 01:39:58 +0000 (01:39 +0000)

Convert sha1_array_lookup to take struct object_id

Convert this function by changing the declaration and definition and
applying the following semantic patch to update the callers:

@@
expression E1, E2;
@@
- sha1_array_lookup(E1, E2.hash)
+ sha1_array_lookup(E1, &E2)

@@
expression E1, E2;
@@
- sha1_array_lookup(E1, E2->hash)
+ sha1_array_lookup(E1, E2)

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

Convert remaining callers of sha1_array_lookup to object_idbrian m. carlson Fri, 31 Mar 2017 01:39:57 +0000 (01:39 +0000)

Convert remaining callers of sha1_array_lookup to object_id

There are a very small number of callers which don't already use struct
object_id. Convert them.

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

Make sha1_array_append take a struct object_id *brian m. carlson Fri, 31 Mar 2017 01:39:56 +0000 (01:39 +0000)

Make sha1_array_append take a struct object_id *

Convert the callers to pass struct object_id by changing the function
declaration and definition and applying the following semantic patch:

@@
expression E1, E2;
@@
- sha1_array_append(E1, E2.hash)
+ sha1_array_append(E1, &E2)

@@
expression E1, E2;
@@
- sha1_array_append(E1, E2->hash)
+ sha1_array_append(E1, E2)

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

daemon: use an argv_array to exec childrenJeff King Tue, 28 Mar 2017 19:48:10 +0000 (15:48 -0400)

daemon: use an argv_array to exec children

Our struct child_process already has its own argv_array.
Let's use that to avoid having to format options into
separate buffers.

Note that we'll need to declare the child process outside of
the run_service_command() helper to do this. But that opens
up a further simplification, which is that the helper can
append to our argument list, saving each caller from
specifying "." manually.

Signed-off-by: Jeff King <peff@peff.net>

gc: replace local buffer with git_pathJeff King Tue, 28 Mar 2017 19:47:03 +0000 (15:47 -0400)

gc: replace local buffer with git_path

We probe the "17/" loose object directory for auto-gc, and
use a local buffer to format the path. We can just use
git_path() for this. It handles paths of any length
(reducing our error handling). And because we feed the
result straight to a system call, we can just use the static
variant.

Note that git_path also knows the string "objects/" is
special, and will replace it with git_object_directory()
when necessary.

Another alternative would be to use sha1_file_name() for the
pretend object "170000...", but that ends up being more
hassle for no gain, as we have to truncate the final path
component.

Signed-off-by: Jeff King <peff@peff.net>

transport-helper: replace checked snprintf with xsnprintfJeff King Tue, 28 Mar 2017 19:47:00 +0000 (15:47 -0400)

transport-helper: replace checked snprintf with xsnprintf

We can use xsnprintf to do our truncation check with less
code. The error message isn't as specific, but the point is
that this isn't supposed to trigger in the first place
(because our buffer is big enough to handle any int).

Signed-off-by: Jeff King <peff@peff.net>

convert unchecked snprintf into xsnprintfJeff King Tue, 28 Mar 2017 19:46:56 +0000 (15:46 -0400)

convert unchecked snprintf into xsnprintf

These calls to snprintf should always succeed, because their
input is small and fixed. Let's use xsnprintf to make sure
this is the case (and to make auditing for actual truncation
easier).

These could be candidates for turning into heap buffers, but
they fall into a few broad categories that make it not worth
doing:

- formatting single numbers is simple enough that we can
see the result should fit

- the size of a sha1 is likewise well-known, and I didn't
want to cause unnecessary conflicts with the ongoing
process to convert these constants to GIT_MAX_HEXSZ

- the interface for curl_errorstr is dictated by curl

Signed-off-by: Jeff King <peff@peff.net>

combine-diff: replace malloc/snprintf with xstrfmtJeff King Tue, 28 Mar 2017 19:46:53 +0000 (15:46 -0400)

combine-diff: replace malloc/snprintf with xstrfmt

There's no need to use the magic "100" when a strbuf can do
it for us.

Signed-off-by: Jeff King <peff@peff.net>

replace unchecked snprintf calls with heap buffersJeff King Tue, 28 Mar 2017 19:46:50 +0000 (15:46 -0400)

replace unchecked snprintf calls with heap buffers

We'd prefer to avoid unchecked snprintf calls because
truncation can lead to unexpected results.

These are all cases where truncation shouldn't ever happen,
because the input to snprintf is fixed in size. That makes
them candidates for xsnprintf(), but it's simpler still to
just use the heap, and then nobody has to wonder if "100" is
big enough.

We'll use xstrfmt() where possible, and a strbuf when we need
the resulting size or to reuse the same buffer in a loop.

Signed-off-by: Jeff King <peff@peff.net>

receive-pack: print --pack-header directly into argv... Jeff King Tue, 28 Mar 2017 19:46:47 +0000 (15:46 -0400)

receive-pack: print --pack-header directly into argv array

After receive-pack reads the pack header from the client, it
feeds the already-read part to index-pack and unpack-objects
via their --pack-header command-line options. To do so, we
format it into a fixed buffer, then duplicate it into the
child's argv_array.

Our buffer is long enough to handle any possible input, so
this isn't wrong. But it's more complicated than it needs to
be; we can just argv_array_pushf() the final value and avoid
the intermediate copy. This drops the magic number and is
more efficient, too.

Note that we need to push to the argv_array in order, which
means we can't do the push until we are in the "unpack-objects
versus index-pack" conditional. Rather than duplicate the
slightly complicated format specifier, I pushed it into a
helper function.

Signed-off-by: Jeff King <peff@peff.net>

name-rev: replace static buffer with strbufJeff King Tue, 28 Mar 2017 19:46:44 +0000 (15:46 -0400)

name-rev: replace static buffer with strbuf

When name-rev needs to format an actual name, we do so into
a fixed-size buffer. That includes the actual ref tip, as
well as any traversal information. Since refs can exceed
1024 bytes, this means you can get a bogus result. E.g.,
doing:

git tag $(perl -e 'print join("/", 1..1024)')
git describe --contains HEAD^

results in ".../282/283", when it should be
".../1023/1024~1".

We can solve this by using a heap buffer. We'll use a
strbuf, which lets us write into the same buffer from our
loop without having to reallocate.

Signed-off-by: Jeff King <peff@peff.net>

create_branch: use xstrfmt for reflog messageJeff King Tue, 28 Mar 2017 19:46:40 +0000 (15:46 -0400)

create_branch: use xstrfmt for reflog message

We generate a reflog message that contains some fixed text
plus a branch name, and use a buffer of size PATH_MAX + 20.
This mostly works if you assume that refnames are shorter
than PATH_MAX, but:

1. That's not necessarily true. PATH_MAX is not always the
filesystem's limit.

2. The "20" is not sufficiently large for the fixed text
anyway.

Let's just switch to a heap buffer so we don't have to even
care.

Signed-off-by: Jeff King <peff@peff.net>

create_branch: move msg setup closer to point of useJeff King Tue, 28 Mar 2017 19:46:36 +0000 (15:46 -0400)

create_branch: move msg setup closer to point of use

In create_branch() we write the reflog msg into a buffer in
the main function, but then use it only inside a
conditional. If you carefully follow the logic, you can
confirm that we never use the buffer uninitialized nor write
when it would not be used. But we can make this a lot more
obvious by simply moving the write step inside the
conditional.

Signed-off-by: Jeff King <peff@peff.net>

avoid using mksnpath for refsJeff King Tue, 28 Mar 2017 19:46:33 +0000 (15:46 -0400)

avoid using mksnpath for refs

Like the previous commit, we'd like to avoid the assumption
that refs fit into PATH_MAX-sized buffers. These callsites
have an extra twist, though: they write the refnames using
mksnpath. This does two things beyond a regular snprintf:

1. It quietly writes "/bad-path/" when truncation occurs.
This saves the caller having to check the error code,
but if you aren't actually feeding the result to a
system call (and we aren't here), it's questionable.

2. It calls cleanup_path(), which removes leading
instances of "./". That's questionable when dealing
with refnames, as we could silently canonicalize a
syntactically bogus refname into a valid one.

Let's convert each case to use a strbuf. This is preferable
to xstrfmt() because we can reuse the same buffer as we
loop.

Signed-off-by: Jeff King <peff@peff.net>

avoid using fixed PATH_MAX buffers for refsJeff King Tue, 28 Mar 2017 19:46:30 +0000 (15:46 -0400)

avoid using fixed PATH_MAX buffers for refs

Many functions which handle refs use a PATH_MAX-sized buffer
to do so. This is mostly reasonable as we have to write
loose refs into the filesystem, and at least on Linux the 4K
PATH_MAX is big enough that nobody would care. But:

1. The static PATH_MAX is not always the filesystem limit.

2. On other platforms, PATH_MAX may be much smaller.

3. As we move to alternate ref storage, we won't be bound
by filesystem limits.

Let's convert these to heap buffers so we don't have to
worry about truncation or size limits.

We may want to eventually constrain ref lengths for sanity
and to prevent malicious names, but we should do so
consistently across all platforms, and in a central place
(like the ref code).

Signed-off-by: Jeff King <peff@peff.net>

fetch: use heap buffer to format reflogJeff King Tue, 28 Mar 2017 19:46:26 +0000 (15:46 -0400)

fetch: use heap buffer to format reflog

Part of the reflog content comes from the environment, which
can be much larger than our fixed buffer. Let's use a heap
buffer so we avoid truncating it.

Signed-off-by: Jeff King <peff@peff.net>