]> Kevux Git Server - rit/log
rit
9 years agoconnect.c: fix leak in parse_one_symref_info()
Jeff King [Thu, 25 May 2017 19:33:05 +0000 (15:33 -0400)]
connect.c: fix leak in parse_one_symref_info()

If we successfully parse a symref value like
"HEAD:refs/heads/master", we add the result to a string
list. But because the string list is marked
STRING_LIST_INIT_DUP, the string list code will make a copy
of the string and add the copy.

This patch fixes it by adding the entry with
string_list_append_nodup(), which lets the string list take
ownership of our newly allocated string. There are two
alternatives that seem like they would work, but aren't the
right solution.

The first is to initialize the list with the "NODUP"
initializer. That would avoid the copy, but then the string
list would not realize that it owns the strings. When we
eventually call string_list_clear(), it would not free the
strings, causing a leak.

The second option would be to use the normal
string_list_append(), but free the local copy in our
function. We can't do this because the local copy actually
contains _two_ strings; the symref name and its target. We
point to the target pointer via the "util" field, and its
memory must last as long as the string list does.

You may also wonder whether it's safe to ever free the local
copy, since the target points into it. The answer is yes,
because we duplicate it in annotaate_refs_with_symref_info
before clearing the string list.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agolog: fix memory leak in open_next_file()
Nguyễn Thái Ngọc Duy [Wed, 3 May 2017 10:16:56 +0000 (17:16 +0700)]
log: fix memory leak in open_next_file()

Noticed-by: Jeff King <peff@peff.net>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agorerere.c: move error_errno() closer to the source system call
Nguyễn Thái Ngọc Duy [Tue, 9 May 2017 10:11:33 +0000 (17:11 +0700)]
rerere.c: move error_errno() closer to the source system call

We are supposed to report errno from fopen(). fclose() between fopen()
and the report function could either change errno or reset it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoprint errno when reporting a system call error
Nguyễn Thái Ngọc Duy [Wed, 3 May 2017 10:16:55 +0000 (17:16 +0700)]
print errno when reporting a system call error

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agowrapper.c: make warn_on_inaccessible() static
Nguyễn Thái Ngọc Duy [Mon, 8 May 2017 10:40:37 +0000 (17:40 +0700)]
wrapper.c: make warn_on_inaccessible() static

After the last patch, this function is not used outside anymore. Keep it
static.

Noticed-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agowrapper.c: add and use fopen_or_warn()
Nguyễn Thái Ngọc Duy [Wed, 3 May 2017 10:16:50 +0000 (17:16 +0700)]
wrapper.c: add and use fopen_or_warn()

When fopen() returns NULL, it could be because the given path does not
exist, but it could also be some other errors and the caller has to
check. Add a wrapper so we don't have to repeat the same error check
everywhere.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agowrapper.c: add and use warn_on_fopen_errors()
Nguyễn Thái Ngọc Duy [Wed, 3 May 2017 10:16:49 +0000 (17:16 +0700)]
wrapper.c: add and use warn_on_fopen_errors()

In many places, Git warns about an inaccessible file after a fopen()
failed. To discern these cases from other cases where we want to warn
about inaccessible files, introduce a new helper specifically to test
whether fopen() failed because the current user lacks the permission to
open file in question.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoconfig.mak.uname: set FREAD_READS_DIRECTORIES for Darwin, too
Junio C Hamano [Wed, 10 May 2017 04:44:33 +0000 (21:44 -0700)]
config.mak.uname: set FREAD_READS_DIRECTORIES for Darwin, too

Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoconfig.mak.uname: set FREAD_READS_DIRECTORIES for Linux and FreeBSD
Nguyễn Thái Ngọc Duy [Wed, 3 May 2017 10:16:48 +0000 (17:16 +0700)]
config.mak.uname: set FREAD_READS_DIRECTORIES for Linux and FreeBSD

This variable is added [1] with the assumption that on a sane system,
fopen(<dir>, "r") should return NULL. Linux and FreeBSD do not meet this
expectation while at least Windows and AIX do. Let's make sure they
behave the same way.

I only tested one version on Linux (4.7.0 with glibc 2.22) and
FreeBSD (11.0) but since GNU/kFreeBSD is fbsd kernel with gnu userspace,
I'm pretty sure it shares the same problem.

[1] cba22528fa (Add compat/fopen.c which returns NULL on attempt to open
    directory - 2008-02-08)

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoclone: use xfopen() instead of fopen()
Nguyễn Thái Ngọc Duy [Wed, 3 May 2017 10:16:47 +0000 (17:16 +0700)]
clone: use xfopen() instead of fopen()

copy_alternates() called fopen() without handling errors. By switching
to xfopen(), this bug is fixed.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agouse xfopen() in more places
Nguyễn Thái Ngọc Duy [Wed, 3 May 2017 10:16:46 +0000 (17:16 +0700)]
use xfopen() in more places

xfopen()

 - provides error details
 - explains error on reading, or writing, or whatever operation
 - has l10n support
 - prints file name in the error

Some of these are missing in the places that are replaced with xfopen(),
which is a clear win. In some other places, it's just less code (not as
clearly a win as the previous case but still is).

The only slight regresssion is in remote-testsvn, where we don't report
the file class (marks files) in the error messages anymore. But since
this is a _test_ svn remote transport, I'm not too concerned.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agogit_fopen: fix a sparse 'not declared' warning
Ramsay Jones [Mon, 8 May 2017 20:45:56 +0000 (21:45 +0100)]
git_fopen: fix a sparse 'not declared' warning

If git is built with the FREAD_READS_DIRECTORIES build variable set, this
would cause sparse to issue a 'not declared, should it be static?' warning
on Linux. This is a result of the method employed by 'compat/fopen.c' to
suppress the (possible) redefinition of the (system) fopen macro, which
also removes the extern declaration of the git_fopen function.

In order to suppress the warning, introduce a new macro to suppress the
definition (or possibly the re-definition) of the fopen symbol as a macro
override. This new macro (SUPPRESS_FOPEN_REDEFINITION) is only defined in
'compat/fopen.c', just prior to the inclusion of the 'git-compat-util.h'
header file.

Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agodocs/config.txt: fix indefinite article in core.fileMode description
SZEDER Gábor [Thu, 25 May 2017 23:20:46 +0000 (01:20 +0200)]
docs/config.txt: fix indefinite article in core.fileMode description

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoWindows: do not treat a path with backslashes as a remote's nick name
Johannes Sixt [Thu, 25 May 2017 12:00:13 +0000 (14:00 +0200)]
Windows: do not treat a path with backslashes as a remote's nick name

On Windows, the remote repository name in, e.g., `git fetch foo\bar`
is clearly not a nickname for a configured remote repository. However,
the function valid_remote_nick() does not account for backslashes.
Use is_dir_sep() to check for both slashes and backslashes on Windows.

This was discovered while playing with Duy's patches that warn after
fopen() failures. The functions that read the branches and remotes
files are protected by a valid_remote_nick() check. Without this
change, a Windows style absolute path is incorrectly regarded as
nickname and is concatenated to a prefix and used with fopen(). This
triggers warnings because a colon in a path name is not allowed:

C:\Temp\gittest>git fetch C:\Temp\gittest
warning: unable to access '.git/remotes/C:\Temp\gittest': Invalid argument
warning: unable to access '.git/branches/C:\Temp\gittest': Invalid argument
From C:\Temp\gittest
 * branch            HEAD       -> FETCH_HEAD

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move entry prepend to libgit
Jeff Smith [Wed, 24 May 2017 05:15:37 +0000 (00:15 -0500)]
blame: move entry prepend to libgit

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move scoreboard setup to libgit
Jeff Smith [Wed, 24 May 2017 05:15:36 +0000 (00:15 -0500)]
blame: move scoreboard setup to libgit

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move scoreboard-related methods to libgit
Jeff Smith [Wed, 24 May 2017 05:15:35 +0000 (00:15 -0500)]
blame: move scoreboard-related methods to libgit

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move fake-commit-related methods to libgit
Jeff Smith [Wed, 24 May 2017 05:15:34 +0000 (00:15 -0500)]
blame: move fake-commit-related methods to libgit

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move origin-related methods to libgit
Jeff Smith [Wed, 24 May 2017 05:15:33 +0000 (00:15 -0500)]
blame: move origin-related methods to libgit

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move core structures to header
Jeff Smith [Wed, 24 May 2017 05:15:32 +0000 (00:15 -0500)]
blame: move core structures to header

The origin, entry, and scoreboard structures are core to the blame
interface and need to be exposed for blame functionality.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: create entry prepend function
Jeff Smith [Wed, 24 May 2017 05:15:31 +0000 (00:15 -0500)]
blame: create entry prepend function

Create function that populates a blame_entry and prepends it to a list.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: create scoreboard setup function
Jeff Smith [Wed, 24 May 2017 05:15:30 +0000 (00:15 -0500)]
blame: create scoreboard setup function

Create function that completes setting up blame_scoreboard structure.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: create scoreboard init function
Jeff Smith [Wed, 24 May 2017 05:15:29 +0000 (00:15 -0500)]
blame: create scoreboard init function

Create function that initializes blame_scoreboard to default values.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: rework methods that determine 'final' commit
Jeff Smith [Wed, 24 May 2017 05:15:28 +0000 (00:15 -0500)]
blame: rework methods that determine 'final' commit

Either prepare_initial or prepare_final is used to determine which
commit is marked as 'final'. Call the underlying methods directly to
make this more clear.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: wrap blame_sort and compare_blame_final
Jeff Smith [Wed, 24 May 2017 05:15:27 +0000 (00:15 -0500)]
blame: wrap blame_sort and compare_blame_final

The new method's interface is marginally cleaner than blame_sort, and
will avoid the need to expose the compare_blame_final method.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move progress updates to a scoreboard callback
Jeff Smith [Wed, 24 May 2017 05:15:26 +0000 (00:15 -0500)]
blame: move progress updates to a scoreboard callback

Allow the interface user to decide how to handle a progress update.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agocache_ref_iterator_begin(): avoid priming unneeded directories
Michael Haggerty [Mon, 22 May 2017 14:17:55 +0000 (16:17 +0200)]
cache_ref_iterator_begin(): avoid priming unneeded directories

When iterating over references, reference priming is used to make sure
that loose references are read into the ref-cache before packed
references, to avoid races. It used to be that the prefix passed to
reference iterators almost always ended in `/`, for example
`refs/heads/`. In that case, the priming code would read all loose
references under `find_containing_dir("refs/heads/")`, which is
"refs/heads/". That's just what we want.

But now that `ref-filter` knows how to pass refname prefixes to
`for_each_fullref_in()`, the prefix might come from user input; for
example,

    git for-each-ref refs/heads

Since the argument doesn't include a trailing slash, the reference
iteration code would prime all of the loose references under
`find_containing_dir("refs/heads")`, which is "refs/". Thus we would
unnecessarily read tags, remote-tracking references, etc., when the
user is only interested in branches.

It is a bit awkward to get around this problem. We can't just append a
slash to the argument, because we don't know ab initio whether an
argument like `refs/tags/release` corresponds to a single tag or to a
directory containing tags.

Moreover, until now a `prefix_ref_iterator` was used to make the final
decision about which references fall within the prefix (the
`cache_ref_iterator` only did a rough cut). This is also inefficient,
because the `prefix_ref_iterator` can't know, for example, that while
you are in a subdirectory that is completely within the prefix, you
don't have to do the prefix check.

So:

* Move the responsibility for doing the prefix check directly to
  `cache_ref_iterator`. This means that `cache_ref_iterator_begin()`
  never has to wrap its return value in a `prefix_ref_iterator`.

* Teach `cache_ref_iterator_begin()` (and `prime_ref_dir()`) to be
  stricter about what they iterate over and what directories they
  prime.

* Teach `cache_ref_iterator` to keep track of whether the current
  `cache_ref_iterator_level` is fully within the prefix. If so, skip
  the prefix checks entirely.

The main benefit of these optimizations is for loose references, since
packed references are always read all at once.

Note that after this change, `prefix_ref_iterator` is only ever used
for its trimming feature and not for its "prefix" feature. But I'm not
ripping out the latter yet, because it might be useful for another
patch series that I'm working on.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: make sanity_check use a callback in scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:25 +0000 (00:15 -0500)]
blame: make sanity_check use a callback in scoreboard

Allow the interface user to decide how to handle a failed sanity check,
whether that be to output with the current state or to do nothing.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move no_whole_file_rename flag to scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:24 +0000 (00:15 -0500)]
blame: move no_whole_file_rename flag to scoreboard

The no_whole_file_rename flag is used in parts of blame that are being
moved to libgit, and should be accessible via the scoreboard structure.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move xdl_opts flags to scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:23 +0000 (00:15 -0500)]
blame: move xdl_opts flags to scoreboard

The xdl_opts flags are used in parts of blame that are being moved to
libgit, and should be accessible via the scoreboard structure.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move show_root flag to scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:22 +0000 (00:15 -0500)]
blame: move show_root flag to scoreboard

The show_root flag is used in parts of blame that are being moved to
libgit, and should be accessible via the scoreboard structure.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move reverse flag to scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:21 +0000 (00:15 -0500)]
blame: move reverse flag to scoreboard

The reverse flag is used in parts of blame that are being moved to
libgit, and should be accessible via the scoreboard structure.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move contents_from to scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:20 +0000 (00:15 -0500)]
blame: move contents_from to scoreboard

The argument from --contents is used in parts of blame that are being
moved to libgit, and should be accessible via the scoreboard structure.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move copy/move thresholds to scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:19 +0000 (00:15 -0500)]
blame: move copy/move thresholds to scoreboard

Copy and move score thresholds are used in parts of blame that are being
moved to libgit, and should be accessible via the scoreboard structure.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move stat counters to scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:18 +0000 (00:15 -0500)]
blame: move stat counters to scoreboard

Statistic counters are used in parts of blame that are being moved to
libgit, and should be accessible via the scoreboard structure.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: rename nth_line function
Jeff Smith [Wed, 24 May 2017 05:15:17 +0000 (00:15 -0500)]
blame: rename nth_line function

Functions that will be publicly exposed should have names that better
reflect what they are a part of.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: rename ent_score function
Jeff Smith [Wed, 24 May 2017 05:15:16 +0000 (00:15 -0500)]
blame: rename ent_score function

Functions that will be publicly exposed should have names that better
reflect what they are a part of.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: rename coalesce function
Jeff Smith [Wed, 24 May 2017 05:15:15 +0000 (00:15 -0500)]
blame: rename coalesce function

Functions that will be publicly exposed should have names that better
reflect what they are a part of.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: rename origin-related functions
Jeff Smith [Wed, 24 May 2017 05:15:14 +0000 (00:15 -0500)]
blame: rename origin-related functions

Functions related to blame_origin that will be publicly exposed should
have names that better reflect what they are a part of.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: rename scoreboard structure to blame_scoreboard
Jeff Smith [Wed, 24 May 2017 05:15:13 +0000 (00:15 -0500)]
blame: rename scoreboard structure to blame_scoreboard

The scoreboard structure is core to the blame interface. Since
scoreboard will become more exposed, rename it to blame_scoreboard to
clarify what it is a part of.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: rename origin structure to blame_origin
Jeff Smith [Wed, 24 May 2017 05:15:12 +0000 (00:15 -0500)]
blame: rename origin structure to blame_origin

The origin structure is core to the blame interface.  Since origin will
become more exposed, rename it to blame_origin to clarify what it is a
part of.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: remove unused parameters
Jeff Smith [Wed, 24 May 2017 05:15:11 +0000 (00:15 -0500)]
blame: remove unused parameters

Clean up blame code before moving it into libgit

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: move textconv_object with related functions
Jeff Smith [Wed, 24 May 2017 05:15:10 +0000 (00:15 -0500)]
blame: move textconv_object with related functions

textconv_object is used in places other than blame.c and should be moved
to a more appropriate location.  Other textconv related functions are
located in diff.c so that seems as good a place as any.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoblame: remove unneeded dependency on blob.h
Jeff Smith [Wed, 24 May 2017 05:15:09 +0000 (00:15 -0500)]
blame: remove unneeded dependency on blob.h

With commit 21666f1 ("convert object type handling from a string to a
number", 2007-02-26), there was no longer a need for blame.c to include
blob.h but it was not removed.

Signed-off-by: Jeff Smith <whydoubt@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agodiff: use blob path for blob/file diffs
Jeff King [Fri, 19 May 2017 12:59:34 +0000 (08:59 -0400)]
diff: use blob path for blob/file diffs

When we diff a blob against a working tree file like:

  git diff HEAD:Makefile Makefile

we always use the working tree filename for both sides of
the diff. In most cases that's fine, as the two would be the
same anyway, as above. And until recently, we used the
"name" for the blob, not the path, which would have the
messy "HEAD:" on the beginning.

But when they don't match, like:

  git diff HEAD:old_path new_path

it makes sense to show both names.

This patch uses the blob's path field if it's available, and
otherwise falls back to using the filename (in preference to
the blob's name, which is likely to be garbage like a raw
sha1).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agodiff: use pending "path" if it is available
Jeff King [Fri, 19 May 2017 12:59:15 +0000 (08:59 -0400)]
diff: use pending "path" if it is available

There's a subtle distinction between "name" and "path" for a
blob that we resolve: the name is what the user told us on
the command line, and the path is what we traversed when
finding the blob within a tree (if we did so).

When we diff blobs directly, we use "name", but "path" is
more likely to be useful to the user (it will find the
correct .gitattributes, and give them a saner diff header).

We still have to fall back to using the name for some cases
(i.e., any blob reference that isn't of the form tree:path).
That's the best we can do in such a case.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agodiff: use the word "path" instead of "name" for blobs
Jeff King [Fri, 19 May 2017 12:58:05 +0000 (08:58 -0400)]
diff: use the word "path" instead of "name" for blobs

The stuff_change() function makes diff_filespecs out of
blobs. The term we generally use for filespecs is "path",
not "name", so let's be consistent here.  That will make
things less confusing when the next patch starts caring
about the path/name distinction inside the pending object
array.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agodiff: pass whole pending entry in blobinfo
Jeff King [Fri, 19 May 2017 12:57:30 +0000 (08:57 -0400)]
diff: pass whole pending entry in blobinfo

When diffing blobs directly, git-diff picks the blobs out of
the rev_info's pending array and copies the relevant bits to
a custom "struct blobinfo". But the pending array entry
already has all of this information (and more, which we'll
use in future patches). Let's just pass the original entry
instead.

In practice, these two blobs are probably adjacent in the
revs->pending array, and we could just pass the whole array.
But the current code is careful to pick each blob out
separately and put it into another array, so we'll continue
to do so and make our own array-of-pointers.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agohandle_revision_arg: record paths for pending objects
Jeff King [Fri, 19 May 2017 12:55:26 +0000 (08:55 -0400)]
handle_revision_arg: record paths for pending objects

If the revision parser sees an argument like tree:path, we
parse it down to the correct blob (or tree), but throw away
the "path" portion. Let's ask get_sha1_with_context() to
record it, and pass it along in the pending array.

This will let programs like git-diff which rely on the
revision-parser show more accurate paths.

Note that the implementation is a little tricky; we have to
make sure we free oc.path in all code paths. For handle_dotdot(),
we can piggy-back on the existing cleanup-wrapper pattern.
The real work happens in handle_dotdot_1(), but the
handle_dotdot() wrapper makes sure that the path is freed no
matter how we exit the function (and for that reason we make
sure that the object_context struct is zero'd, so if we fail
to even get to the get_sha1_with_context() call, we just end
up calling free(NULL)).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agohandle_revision_arg: record modes for "a..b" endpoints
Jeff King [Fri, 19 May 2017 12:55:11 +0000 (08:55 -0400)]
handle_revision_arg: record modes for "a..b" endpoints

The "a..b" revision syntax was designed to handle commits,
so it doesn't bother to record any mode we find while
traversing a "tree:path" endpoint. These days "git diff" can
diff blobs using either "a:path..b:path" (with dots) or
"a:path b:path" (without), but the two behave
inconsistently, as the with-dots version fails to notice the
mode.

Let's teach the dot-dot range parser to record modes; it
doesn't cost us anything, and it makes this case work.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agot4063: add tests of direct blob diffs
Jeff King [Fri, 19 May 2017 12:54:56 +0000 (08:54 -0400)]
t4063: add tests of direct blob diffs

The git-diff command can directly compare two blobs (or a
blob and a file), but we don't test this at all. Let's add
some basic tests that reveal a few problems.

There are basically four interesting inputs:

  1. sha1 against sha1 (where diff has no information beyond
     the contents)

  2. tree:path against tree:path (where it can get
     information via get_sha1_with_context)

  3. Same as (2), but using the ".." range syntax

  4. tree:path against a filename

And beyond generating a sane diff, we care about a few
little bits: which paths they show in the diff header, and
whether they correctly pick up a mode change.

They should all be able to show a mode except for (1),
though note that case (3) is currently broken.

For the headers, we would ideally show the path within the
tree if we have it, making:

  git diff a:path b:path

look the same as:

  git diff a b -- path

We can't always do that (e.g., in the direct sha1/sha1 diff,
we have no path to show), in which case we should fall back
to the name that resolved to the blob (which is nonsense
from the repository's perspective, but is the best we can
do).

Aside from the fallback case in (1), none of the cases get
this right. Cases (2) and (3) always show the full
tree:path, even though we should be able to know just the
"path" portion.

Case (4) picks up the filename path, but assigns it to
_both_ sides of the diff. So this works for:

  git diff tree:path path

but not for:

  git diff tree:other_path path

The appropriate tests are marked to expect failure.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoget_sha1_with_context: dynamically allocate oc->path
Jeff King [Fri, 19 May 2017 12:54:43 +0000 (08:54 -0400)]
get_sha1_with_context: dynamically allocate oc->path

When a sha1 lookup returns the tree path via "struct
object_context", it just copies it into a fixed-size buffer.
This means the result can be truncated, and it means our
"struct object_context" consumes a lot of stack space.

Instead, let's allocate a string on the heap. Because most
callers don't care about this information, we'll avoid doing
it by default (so they don't all have to start calling
free() on the result). There are basically two options for
the caller to signal to us that it's interested:

  1. By setting a pointer to storage in the object_context.

  2. By passing a flag in another parameter.

Doing (1) would match the way that sha1_object_info_extended()
works. But it would mean that every caller would have to
initialize the object_context, which they don't currently
have to do.

This patch does (2), and adds a new bit to the function's
flags field. All of the callers that look at the "path"
field are updated to pass the new flag.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoget_sha1_with_context: always initialize oc->symlink_path
Jeff King [Fri, 19 May 2017 12:52:25 +0000 (08:52 -0400)]
get_sha1_with_context: always initialize oc->symlink_path

The get_sha1_with_context() function zeroes out the
oc->symlink_path strbuf, but doesn't use strbuf_init() to
set up the usual invariants (like pointing to the slopbuf).
We don't actually write to the oc->symlink_path strbuf
unless we call get_tree_entry_follow_symlinks(), and that
function does initialize it. However, readers may still look
at the zero'd strbuf.

In practice this isn't a triggerable bug. The only caller
that looks at it only does so when the mode we found is 0.
This doesn't happen for non-tree-entries (where we return
S_IFINVALID). A broken tree entry could have a mode of 0,
but canon_mode() quietly rewrites that into S_IFGITLINK.
So the "0" mode should only come up when we did indeed find
a symlink.

This is mostly just an accident of how the code happens to
work, though. Let's future-proof ourselves to make sure the
strbuf is properly initialized for all calls (it's only a
few struct member assignments, not a heap allocation).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agosha1_name: consistently refer to object_context as "oc"
Jeff King [Fri, 19 May 2017 12:52:06 +0000 (08:52 -0400)]
sha1_name: consistently refer to object_context as "oc"

An early version of the patch to add object_context used the
name object_resolve_context. This was later shortened to
just object_context, but the "orc" variable name stuck in a
few places.  Let's use "oc", which is used elsewhere in the
code.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agohandle_revision_arg: add handle_dotdot() helper
Jeff King [Fri, 19 May 2017 12:52:00 +0000 (08:52 -0400)]
handle_revision_arg: add handle_dotdot() helper

The handle_revision_arg function is rather long, and a big
chunk of it is handling the range operators. Let's pull that
out to a separate helper. While we're doing so, we can clean
up a few of the rough edges that made the flow hard to
follow:

  - instead of manually restoring *dotdot (that we overwrote
    with a NUL), do the real work in a sub-helper, which
    makes it clear that the munge/restore lines are a
    matched pair

  - eliminate a goto which wasn't actually used for control
    flow, but only to avoid duplicating a few lines
    (instead, those lines are pushed into another helper
    function)

  - use early returns instead of deep nesting

  - consistently name all variables for the left-hand side
    of the range as "a" (rather than "this" or "from") and
    the right-hand side as "b" (rather than "next", or using
    the unadorned "sha1" or "flags" from the main function).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agohandle_revision_arg: hoist ".." check out of range parsing
Jeff King [Fri, 19 May 2017 12:51:40 +0000 (08:51 -0400)]
handle_revision_arg: hoist ".." check out of range parsing

Since 003c84f6d (specifying ranges: we did not mean to make
".." an empty set, 2011-05-02), we treat the argument ".."
specially. We detect it by noticing that both sides of the
range are empty, and that this is a non-symmetric two-dot
range.

While correct, this makes the code overly complicated. We
can just detect ".." up front before we try to do further
parsing. This avoids having to de-munge the NUL from dotdot,
and lets us eliminate an extra const array (which we needed
only to do direct pointer comparisons).

It also removes the one code path from the range-parsing
conditional that requires us to return -1. That will make it
simpler to pull the dotdot parsing out into its own
function.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agohandle_revision_arg: stop using "dotdot" as a generic pointer
Jeff King [Fri, 19 May 2017 12:50:07 +0000 (08:50 -0400)]
handle_revision_arg: stop using "dotdot" as a generic pointer

The handle_revision_arg() function has a "dotdot" variable
that it uses to find a ".." or "..." in the argument. If we
don't find one, we look for other marks, like "^!". But we
just keep re-using the "dotdot" variable, which is
confusing.

Let's introduce a separate "mark" variable that can be used
for these other marks. They still reuse the same variable,
but at least the name is no longer actively misleading.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agohandle_revision_arg: simplify commit reference lookups
Jeff King [Fri, 19 May 2017 12:48:46 +0000 (08:48 -0400)]
handle_revision_arg: simplify commit reference lookups

The "dotdot" range parser avoids calling
lookup_commit_reference() if we are directly fed two
commits. But its casts are unnecessarily complex; that
function will just return a commit we pass into it.

Just calling the function all the time is much simpler, and
doesn't do any significant extra work (the object is already
parsed, and deref_tag() on a non-tag is a noop; we do incur
one extra lookup_object() call, but that's fairly trivial).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agohandle_revision_arg: reset "dotdot" consistently
Jeff King [Tue, 23 May 2017 19:51:32 +0000 (15:51 -0400)]
handle_revision_arg: reset "dotdot" consistently

When we are parsing a range like "a..b", we write a
temporary NUL over the first ".", so that we can access the
names "a" and "b" as C strings. But our restoration of the
original "." is done at inconsistent times, which can lead
to confusing results.

For most calls, we restore the "." after we resolve the
names, but before we call verify_non_filename().  This means
that when we later call add_pending_object(), the name for
the left-hand "a" has been re-expanded to "a..b". You can
see this with:

  git log --source a...b

where "b" will be correctly marked with "b", but "a" will be
marked with "a...b". Likewise with "a..b" (though you need
to use --boundary to even see "a" at all in that case).

To top off the confusion, when the REVARG_CANNOT_BE_FILENAME
flag is set, we skip the non-filename check, and leave the
NUL in place.

That means we do report the correct name for "a" in the
pending array. But some code paths try to show the whole
"a...b" name in error messages, and these erroneously show
only "a" instead of "a...b". E.g.:

  $ git cherry-pick HEAD:foo...HEAD:foo
  error: object d95f3ad14dee633a758d2e331151e950dd13e4ed is a blob, not a commit
  error: object d95f3ad14dee633a758d2e331151e950dd13e4ed is a blob, not a commit
  fatal: Invalid symmetric difference expression HEAD:foo

(That last message should be "HEAD:foo...HEAD:foo"; I used
cherry-pick because it passes the CANNOT_BE_FILENAME flag).

As an interesting side note, cherry-pick actually looks at
and re-resolves the arguments from the pending->name fields.
So it would have been visibly broken by the first bug, but
the effect was canceled out by the second one.

This patch makes the whole function consistent by re-writing
the NUL immediately after calling verify_non_filename(), and
then restoring the "." as appropriate in some error-printing
and early-return code paths.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoclean: teach clean -d to preserve ignored paths
Samuel Lijin [Tue, 23 May 2017 10:09:37 +0000 (06:09 -0400)]
clean: teach clean -d to preserve ignored paths

There is an implicit assumption that a directory containing only
untracked and ignored paths should itself be considered untracked. This
makes sense in use cases where we're asking if a directory should be
added to the git database, but not when we're asking if a directory can
be safely removed from the working tree; as a result, clean -d would
assume that an "untracked" directory containing ignored paths could be
deleted, even though doing so would also remove the ignored paths.

To get around this, we teach clean -d to collect ignored paths and skip
an untracked directory if it contained an ignored path, instead just
removing the untracked contents thereof. To achieve this, cmd_clean()
has to collect all untracked contents of untracked directories, in
addition to all ignored paths, to determine which untracked dirs must be
skipped (because they contain ignored paths) and which ones should *not*
be skipped.

For this purpose, correct_untracked_entries() is introduced to prune a
given dir_struct of untracked entries containing ignored paths and those
untracked entries encompassed by the untracked entries which are not
pruned away.

A memory leak is also fixed in cmd_clean().

This also fixes the known breakage in t7300, since clean -d now skips
untracked directories containing ignored paths.

Signed-off-by: Samuel Lijin <sxlijin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agotag: duplicate mention of --contains should mention --no-contains
Ævar Arnfjörð Bjarmason [Mon, 15 May 2017 12:23:31 +0000 (12:23 +0000)]
tag: duplicate mention of --contains should mention --no-contains

Fix a duplicate mention of --contains in the SYNOPSIS to mention
--no-contains.

This fixes an error introduced in my commit ac3f5a3468 ("ref-filter:
add --no-contains option to tag/branch/for-each-ref", 2017-03-24).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agomingw: simplify PATH handling
René Scharfe [Sat, 20 May 2017 19:35:37 +0000 (21:35 +0200)]
mingw: simplify PATH handling

On Windows the environment variable PATH contains a semicolon-separated
list of directories to search for, in order, when looking for the
location of a binary to run.  get_path_split() parses it and returns an
array of string copies, which is iterated by path_lookup(), which in
turn passes each entry to lookup_prog().

Change lookup_prog() to take the directory name as a length-limited
string instead of as a NUL-terminated one and parse PATH directly in
path_lookup().  This avoids memory allocations, simplifying the code.

Helped-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agomingw.h: permit arguments with side effects for is_dir_sep
Johannes Sixt [Mon, 22 May 2017 18:58:32 +0000 (20:58 +0200)]
mingw.h: permit arguments with side effects for is_dir_sep

Taking git-compat-util.h's cue (which uses an inline function to back
is_dir_sep()), let's use an inline function to back also the Windows
version of is_dir_sep(). This avoids problems when calling the function
with arguments that do more than just provide a single character, e.g.
incrementing a pointer. Example:

    is_dir_sep(*p++)

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoDocumentation: fix formatting typo in pretty-formats.txt
Andreas Heiduk [Mon, 22 May 2017 20:59:58 +0000 (22:59 +0200)]
Documentation: fix formatting typo in pretty-formats.txt

A missing space messed up formatting of the `%(trailers)` format.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoref-filter: limit traversal to prefix
Jeff King [Mon, 22 May 2017 14:17:54 +0000 (16:17 +0200)]
ref-filter: limit traversal to prefix

When we are matching refnames against a pattern, then we know that the
beginning of any refname that can match the pattern has to match the
part of the pattern up to the first glob character. For example, if
the pattern is `refs/heads/foo*bar`, then it can only match a
reference that has the prefix `refs/heads/foo`.

So pass that prefix to `for_each_fullref_in()`. This lets the ref code
avoid passing us the full set of refs, and in some cases avoid reading
them in the first place.

Note that this applies only when the `match_as_path` flag is set
(i.e., when `for-each-ref` is the caller), as the matching rules for
git-branch and git-tag are subtly different.

This could be generalized to the case of multiple patterns, but (a) it
probably doesn't come up that often, and (b) it is more awkward to
deal with multiple patterns (e.g., the patterns might not be
disjoint). So, since this is just an optimization, punt on the case of
multiple patterns.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agocreate_ref_entry(): remove `check_name` option
Michael Haggerty [Mon, 22 May 2017 14:17:53 +0000 (16:17 +0200)]
create_ref_entry(): remove `check_name` option

Only one caller was using it, so move the check to that caller.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agorefs_ref_iterator_begin(): handle `GIT_REF_PARANOIA`
Michael Haggerty [Mon, 22 May 2017 14:17:52 +0000 (16:17 +0200)]
refs_ref_iterator_begin(): handle `GIT_REF_PARANOIA`

Instead of handling `GIT_REF_PARANOIA` in
`files_ref_iterator_begin()`, handle it in
`refs_ref_iterator_begin()`, where it will cover all reference stores.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoread_packed_refs(): report unexpected fopen() failures
Michael Haggerty [Mon, 22 May 2017 14:17:51 +0000 (16:17 +0200)]
read_packed_refs(): report unexpected fopen() failures

The old code ignored any errors encountered when trying to fopen the
"packed-refs" file, treating all such failures as if the file didn't
exist. But it could be that there is some other error opening the
file (e.g., permissions problems), and we don't want to silently
ignore such problems. So report any failures that are not due to
ENOENT.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoread_packed_refs(): do more of the work of reading packed refs
Michael Haggerty [Mon, 22 May 2017 14:17:50 +0000 (16:17 +0200)]
read_packed_refs(): do more of the work of reading packed refs

Teach `read_packed_refs()` to also

* Allocate and initialize the new `packed_ref_cache`
* Open and close the `packed-refs` file
* Update the `validity` field of the new object

This decreases the coupling between `packed_refs_cache` and
`files_ref_store` by a little bit.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoget_packed_ref_cache(): assume "packed-refs" won't change while locked
Michael Haggerty [Mon, 22 May 2017 14:17:49 +0000 (16:17 +0200)]
get_packed_ref_cache(): assume "packed-refs" won't change while locked

If we've got the "packed-refs" file locked, then it can't change;
there's no need to keep calling `stat_validity_check()` on it.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoshould_pack_ref(): new function, extracted from `files_pack_refs()`
Michael Haggerty [Mon, 22 May 2017 14:17:48 +0000 (16:17 +0200)]
should_pack_ref(): new function, extracted from `files_pack_refs()`

Extract a function for deciding whether a reference should be packed.
It is a self-contained bit of logic, so splitting it out improves
readability.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoref_update_reject_duplicates(): add a sanity check
Michael Haggerty [Mon, 22 May 2017 14:17:47 +0000 (16:17 +0200)]
ref_update_reject_duplicates(): add a sanity check

It's pretty cheap to make sure that the caller didn't pass us an
unsorted list by accident, so do so.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoref_update_reject_duplicates(): use `size_t` rather than `int`
Michael Haggerty [Mon, 22 May 2017 14:17:46 +0000 (16:17 +0200)]
ref_update_reject_duplicates(): use `size_t` rather than `int`

Eliminate a theoretical risk of integer overflow if the two types have
different sizes.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoref_update_reject_duplicates(): expose function to whole refs module
Michael Haggerty [Mon, 22 May 2017 14:17:45 +0000 (16:17 +0200)]
ref_update_reject_duplicates(): expose function to whole refs module

It will soon have some other users.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoref_transaction_prepare(): new optional step for reference updates
Michael Haggerty [Mon, 22 May 2017 14:17:44 +0000 (16:17 +0200)]
ref_transaction_prepare(): new optional step for reference updates

In the future, compound reference stores will sometimes need to modify
references in two different reference stores at the same time, meaning
that a single logical reference transaction might have to be
implemented as two internal sub-transactions. They won't want to call
`ref_transaction_commit()` for the two sub-transactions one after the
other, because that wouldn't be atomic (the first commit could succeed
and the second one fail). Instead, they will want to prepare both
sub-transactions (i.e., obtain any necessary locks and do any
pre-checks), and only if both prepare steps succeed, then commit both
sub-transactions.

Start preparing for that day by adding a new, optional
`ref_transaction_prepare()` step to the reference transaction
sequence, which obtains the locks and does any prechecks, reporting
any errors that occur. Also add a `ref_transaction_abort()` function
that can be used to abort a sub-transaction even if it has already
been prepared.

That is on the side of the public-facing API. On the side of the
`ref_store` VTABLE, get rid of `transaction_commit` and instead add
methods `transaction_prepare`, `transaction_finish`, and
`transaction_abort`. A `ref_transaction_commit()` now basically calls
methods `transaction_prepare` then `transaction_finish`.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoref_transaction_commit(): check for valid `transaction->state`
Michael Haggerty [Mon, 22 May 2017 14:17:43 +0000 (16:17 +0200)]
ref_transaction_commit(): check for valid `transaction->state`

Move the check that `transaction->state` is valid from
`files_transaction_commit()` to `ref_transaction_commit()`, where
other future reference backends can benefit from it as well.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agofiles_transaction_cleanup(): new helper function
Michael Haggerty [Mon, 22 May 2017 14:17:42 +0000 (16:17 +0200)]
files_transaction_cleanup(): new helper function

Extract the cleanup functionality from `files_transaction_commit()`
into a new function. It will soon have another caller.

Use the common cleanup code even on early exit if the transaction is
empty, to reduce code duplication.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agofiles_ref_store: put the packed files lock directly in this struct
Michael Haggerty [Mon, 22 May 2017 14:17:41 +0000 (16:17 +0200)]
files_ref_store: put the packed files lock directly in this struct

Instead of using a global `lock_file` instance for the main
"packed-refs" file and using a pointer in `files_ref_store` to keep
track of whether it is locked, embed the `lock_file` instance directly
in the `files_ref_store` struct and use the new
`is_lock_file_locked()` function to keep track of whether it is
locked. This keeps related data together and makes the main reference
store less of a special case.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agofiles-backend: move `lock` member to `files_ref_store`
Michael Haggerty [Mon, 22 May 2017 14:17:40 +0000 (16:17 +0200)]
files-backend: move `lock` member to `files_ref_store`

Move the `lock` member from `packed_ref_cache` to `files_ref_store`,
since at most one cache can have a locked "packed-refs" file
associated with it. Rename it to `packed_refs_lock` to make its
purpose clearer in its new home. More changes are coming here shortly.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agolockfile: add a new method, is_lock_file_locked()
Michael Haggerty [Mon, 22 May 2017 14:17:39 +0000 (16:17 +0200)]
lockfile: add a new method, is_lock_file_locked()

It will soon prove useful.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoref_store: take a `msg` parameter when deleting references
Michael Haggerty [Mon, 22 May 2017 14:17:38 +0000 (16:17 +0200)]
ref_store: take a `msg` parameter when deleting references

Just because the files backend can't retain reflogs for deleted
references is no reason that they shouldn't be supported by the
virtual method interface. Also, `delete_ref()` and `refs_delete_ref()`
have already gained `msg` parameters. Now let's add them to
`delete_refs()` and `refs_delete_refs()`.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agorefs: use `size_t` indexes when iterating over ref transaction updates
Michael Haggerty [Mon, 22 May 2017 14:17:37 +0000 (16:17 +0200)]
refs: use `size_t` indexes when iterating over ref transaction updates

Eliminate any chance of integer overflow on platforms where the two
types have different sizes.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agorefs_ref_iterator_begin(): don't check prefixes redundantly
Michael Haggerty [Mon, 22 May 2017 14:17:36 +0000 (16:17 +0200)]
refs_ref_iterator_begin(): don't check prefixes redundantly

The backend already correctly restricts its output to references whose
names start with the prefix. By passing the prefix again to
`prefix_ref_iterator`, we were forcing that iterator to do redundant
prefix comparisons. So set it to the empty string.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoprefix_ref_iterator: don't trim too much
Michael Haggerty [Mon, 22 May 2017 14:17:35 +0000 (16:17 +0200)]
prefix_ref_iterator: don't trim too much

The `trim` parameter can be set independently of `prefix`. So if some
caller were to set `trim` to be greater than `strlen(prefix)`, we
could end up pointing the `refname` field of the iterator past the NUL
of the actual reference name string.

That can't happen currently, because `trim` is always set either to
zero or to `strlen(prefix)`. But even the latter could lead to
confusion, if a refname is exactly equal to the prefix, because then
we would set the outgoing `refname` to the empty string.

And we're about to decouple the `prefix` and `trim` arguments even
more, so let's be cautious here. Report a bug if ever asked to trim a
reference whose name is not longer than `trim`.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agofiles-backend: use `die("BUG: ...")`, not `die("internal error: ...")`
Michael Haggerty [Mon, 22 May 2017 14:17:34 +0000 (16:17 +0200)]
files-backend: use `die("BUG: ...")`, not `die("internal error: ...")`

The former is by far more common in our codebase.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoref_iterator_begin_fn(): fix docstring
Michael Haggerty [Mon, 22 May 2017 14:17:33 +0000 (16:17 +0200)]
ref_iterator_begin_fn(): fix docstring

The iterator returned by this function only includes references whose
names start with the whole prefix, not all of those in
`find_containing_dir(prefix)` as the old docstring claimed. This
docstring was probably copy-pasted from old ref-cache code, which had
the old specification. But now, `cache_ref_iterator_begin()`
(from which the files reference iterator gets its values)
automatically wraps its output using `prefix_ref_iterator_begin()`
when necessary, so it has the stricter behavior.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agorefs.h: clarify docstring for the ref_transaction_update()-related fns
Michael Haggerty [Mon, 22 May 2017 14:17:32 +0000 (16:17 +0200)]
refs.h: clarify docstring for the ref_transaction_update()-related fns

In particular, make it clear that they make copies of the sha1
arguments.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agot3600: clean up permissions test properly
Michael Haggerty [Mon, 22 May 2017 14:17:31 +0000 (16:17 +0200)]
t3600: clean up permissions test properly

The test of failing `git rm -f` removes the write permissions on the
test directory, but fails to restore them if the test fails. This
means that the test temporary directory cannot be cleaned up, which
means that subsequent attempts to run the test fail mysteriously.

Instead, do the cleanup in a `test_when_finished` block so that it
can't be skipped.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoMerge branch 'bc/object-id'
Junio C Hamano [Tue, 23 May 2017 05:29:19 +0000 (14:29 +0900)]
Merge branch 'bc/object-id'

* bc/object-id: (53 commits)
  object: convert parse_object* to take struct object_id
  tree: convert parse_tree_indirect to struct object_id
  sequencer: convert do_recursive_merge to struct object_id
  diff-lib: convert do_diff_cache to struct object_id
  builtin/ls-tree: convert to struct object_id
  merge: convert checkout_fast_forward to struct object_id
  sequencer: convert fast_forward_to to struct object_id
  builtin/ls-files: convert overlay_tree_on_cache to object_id
  builtin/read-tree: convert to struct object_id
  sha1_name: convert internals of peel_onion to object_id
  upload-pack: convert remaining parse_object callers to object_id
  revision: convert remaining parse_object callers to object_id
  revision: rename add_pending_sha1 to add_pending_oid
  http-push: convert process_ls_object and descendants to object_id
  refs/files-backend: convert many internals to struct object_id
  refs: convert struct ref_update to use struct object_id
  ref-filter: convert some static functions to struct object_id
  Convert struct ref_array_item to struct object_id
  Convert the verify_pack callback to struct object_id
  Convert lookup_tag to struct object_id
  ...

9 years agoDocumentation: fix reference to ifExists for interpret-trailers
Andreas Heiduk [Mon, 22 May 2017 19:45:33 +0000 (21:45 +0200)]
Documentation: fix reference to ifExists for interpret-trailers

The manual for "git interpret-trailers" mentioned a non-existing
literal `overwrite` for its config option `trailer.ifexists`.  The
correct name for that choice is `replace`.

Signed-off-by: Andreas Heiduk <asheiduk@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agot5531: fix test description
Stefan Beller [Mon, 22 May 2017 19:01:14 +0000 (12:01 -0700)]
t5531: fix test description

The description of the test was not enclosed in single quotes, which
broke the coloring scheme that I am used to.  Upon closer inspection
the test is good, but the description is a bit vague. So extend the
description of the first test.

While at it align the description of the file to match what we actually
test in the file.

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoSecond batch for 2.14
Junio C Hamano [Tue, 23 May 2017 04:51:32 +0000 (13:51 +0900)]
Second batch for 2.14

Signed-off-by: Junio C Hamano <gitster@pobox.com>
9 years agoMerge branch 'ab/fix-poison-tests'
Junio C Hamano [Tue, 23 May 2017 04:46:08 +0000 (13:46 +0900)]
Merge branch 'ab/fix-poison-tests'

Update tests to pass under GETTEXT_POISON (a mechanism to ensure
that output strings that should not be translated are not
translated by mistake), and tell TravisCI to run them.

* ab/fix-poison-tests:
  travis-ci: add job to run tests with GETTEXT_POISON
  travis-ci: setup "prove cache" in "script" step
  tests: fix tests broken under GETTEXT_POISON=YesPlease

9 years agoMerge branch 'tb/dedup-crlf-tests'
Junio C Hamano [Tue, 23 May 2017 04:46:07 +0000 (13:46 +0900)]
Merge branch 'tb/dedup-crlf-tests'

* tb/dedup-crlf-tests:
  t0027: tests are not expensive; remove t0025

9 years agoMerge branch 'jt/push-options-doc'
Junio C Hamano [Tue, 23 May 2017 04:46:07 +0000 (13:46 +0900)]
Merge branch 'jt/push-options-doc'

The receive-pack program now makes sure that the push certificate
records the same set of push options used for pushing.

* jt/push-options-doc:
  receive-pack: verify push options in cert
  docs: correct receive.advertisePushOptions default

9 years agoMerge branch 'ab/doc-replace-gmane-links'
Junio C Hamano [Tue, 23 May 2017 04:46:05 +0000 (13:46 +0900)]
Merge branch 'ab/doc-replace-gmane-links'

The Web interface to gmane news archive is long gone, even though
the articles are still accessible via NTTP.  Replace the links with
ones to public-inbox.org.  Because their message identification is
based on the actual message-id, it is likely that it will be easier
to migrate away from it if/when necessary.

* ab/doc-replace-gmane-links:
  doc: replace more gmane links
  doc: replace a couple of broken gmane links

9 years agoMerge branch 'rs/checkout-am-fix-unborn'
Junio C Hamano [Tue, 23 May 2017 04:46:05 +0000 (13:46 +0900)]
Merge branch 'rs/checkout-am-fix-unborn'

A few codepaths in "checkout" and "am" working on an unborn branch
tried to access an uninitialized piece of memory.

* rs/checkout-am-fix-unborn:
  am: check return value of resolve_refdup before using hash
  checkout: check return value of resolve_refdup before using hash

9 years agoMerge branch 'ls/travis-relays-for-windows-ci'
Junio C Hamano [Tue, 23 May 2017 04:46:03 +0000 (13:46 +0900)]
Merge branch 'ls/travis-relays-for-windows-ci'

* ls/travis-relays-for-windows-ci:
  travis-ci: retry if Git for Windows CI returns HTTP error 502 or 503
  travis-ci: handle Git for Windows CI status "failed" explicitly

9 years agoMerge branch 'ah/log-decorate-default-to-auto'
Junio C Hamano [Tue, 23 May 2017 04:46:02 +0000 (13:46 +0900)]
Merge branch 'ah/log-decorate-default-to-auto'

Setting "log.decorate=false" in the configuration file did not take
effect in v2.13, which has been corrected.

* ah/log-decorate-default-to-auto:
  builtin/log: honor log.decorate

9 years agoMerge branch 'bw/submodule-with-bs-path'
Junio C Hamano [Tue, 23 May 2017 04:46:01 +0000 (13:46 +0900)]
Merge branch 'bw/submodule-with-bs-path'

A hotfix to a topic that is already in v2.13.

* bw/submodule-with-bs-path:
  t7400: add !CYGWIN prerequisite to 'add with \\ in path'