]> git.proxmox.com Git - libgit2.git/log
libgit2.git
7 years agoindex: remove file-scope entry size macros
Patrick Steinhardt [Fri, 19 May 2017 12:22:35 +0000 (14:22 +0200)]
index: remove file-scope entry size macros

All index entry size computations are now performed in
`index_entry_size`. As such, we do not need the file-scope macros for
computing these sizes anymore. Remove them and move the `entry_size`
macro into the `index_entry_size` function.

7 years agoindex: don't right-pad paths when writing compressed entries
Patrick Steinhardt [Fri, 19 May 2017 11:59:53 +0000 (13:59 +0200)]
index: don't right-pad paths when writing compressed entries

Our code to write index entries to disk does not check whether the
entry that is to be written should use prefix compression for the path.
As such, we were overallocating memory and added bogus right-padding
into the resulting index entries. As there is no padding allowed in the
index version 4 format, this should actually result in an invalid index.

Fix this by re-using the newly extracted `index_entry_size` function.

7 years agoindex: move index entry size computation into its own function
Patrick Steinhardt [Fri, 19 May 2017 11:38:34 +0000 (13:38 +0200)]
index: move index entry size computation into its own function

Create a new function `index_entry_size` which encapsulates the logic to
calculate how much space is needed for an index entry, whether it is
simple/extended or compressed/uncompressed. This can later be re-used by
our code writing index entries.

7 years agoindex: set last written index entry in foreach-entry-loop
Patrick Steinhardt [Fri, 19 May 2017 10:35:21 +0000 (12:35 +0200)]
index: set last written index entry in foreach-entry-loop

The last written disk entry is currently being written inside of the
function `write_disk_entry`. Make behavior a bit more obviously by
instead setting it inside of `write_entries` while iterating all
entries.

7 years agoindex: set last entry when reading compressed entries
Patrick Steinhardt [Fri, 12 May 2017 08:01:43 +0000 (10:01 +0200)]
index: set last entry when reading compressed entries

To calculate the path of a compressed index entry, we need to know the
preceding entry's path. While we do actually set the first predecessor
correctly to "", we fail to update this while reading the entries.

Fix the issue by updating `last` inside of the loop. Previously, we've
been passing a double-pointer to `read_entry`, which it didn't update.
As it is more obvious to update the pointer inside the loop itself,
though, we can simply convert it to a normal pointer.

7 years agoindex: fix confusion with shared prefix in compressed path names
Patrick Steinhardt [Wed, 10 May 2017 12:27:12 +0000 (14:27 +0200)]
index: fix confusion with shared prefix in compressed path names

The index version 4 introduced compressed path names for the entries.
From the git.git index-format documentation:

    At the beginning of an entry, an integer N in the variable width
    encoding [...] is stored, followed by a NUL-terminated string S.
    Removing N bytes from the end of the path name for the previous
    entry, and replacing it with the string S yields the path name for
    this entry.

But instead of stripping N bytes from the previous path's string and
using the remaining prefix, we were instead simply concatenating the
previous path with the current entry path, which is obviously wrong.

Fix the issue by correctly copying the first N bytes of the previous
entry only and concatenating the result with our current entry's path.

7 years agovarint: fix computation for remaining buffer space
Patrick Steinhardt [Mon, 22 May 2017 10:53:44 +0000 (12:53 +0200)]
varint: fix computation for remaining buffer space

When encoding varints to a buffer, we want to remain sure that the
required buffer space does not exceed what is actually available. Our
current check does not do the right thing, though, in that it does not
honor that our `pos` variable counts the position down instead of up. As
such, we will require too much memory for small varints and not enough
memory for big varints.

Fix the issue by correctly calculating the required size as
`(sizeof(varint) - pos)`. Add a test which failed before.

7 years agoMerge branch 'pr/4228'
Edward Thomson [Sun, 4 Jun 2017 21:46:07 +0000 (22:46 +0100)]
Merge branch 'pr/4228'

7 years agoworktree: upgrade lock to an int
Edward Thomson [Sun, 4 Jun 2017 21:44:30 +0000 (22:44 +0100)]
worktree: upgrade lock to an int

7 years agoMerge pull request #4239 from roblg/toplevel-dir-ignore-fix
Edward Thomson [Sun, 4 Jun 2017 17:35:39 +0000 (19:35 +0200)]
Merge pull request #4239 from roblg/toplevel-dir-ignore-fix

Fix issue with directory glob ignore in subdirectories

7 years agoMerge pull request #4243 from pks-t/pks/submodule-workdir
Edward Thomson [Sun, 4 Jun 2017 17:03:07 +0000 (19:03 +0200)]
Merge pull request #4243 from pks-t/pks/submodule-workdir

Submodule working directory

7 years agoMerge pull request #4179 from libgit2/ethomson/expand_tilde
Carlos Martín Nieto [Sat, 20 May 2017 15:18:07 +0000 (17:18 +0200)]
Merge pull request #4179 from libgit2/ethomson/expand_tilde

Introduce home directory expansion function for config files, attribute files

7 years agoMerge pull request #4097 from implausible/fix/auto-detect-proxy-callbacks
Carlos Martín Nieto [Sat, 20 May 2017 12:18:32 +0000 (14:18 +0200)]
Merge pull request #4097 from implausible/fix/auto-detect-proxy-callbacks

Fix proxy auto detect not utilizing callbacks

7 years agoMerge pull request #4174 from libgit2/ethomson/set_head_to_tag
Carlos Martín Nieto [Sat, 20 May 2017 12:17:36 +0000 (14:17 +0200)]
Merge pull request #4174 from libgit2/ethomson/set_head_to_tag

git_repository_set_head: use tag name in reflog

7 years agoMerge pull request #4231 from wabain/open-revrange
Carlos Martín Nieto [Sat, 20 May 2017 12:13:27 +0000 (14:13 +0200)]
Merge pull request #4231 from wabain/open-revrange

revparse: support open-ended ranges

7 years agorepository: make check if repo is a worktree more strict
Patrick Steinhardt [Fri, 19 May 2017 07:21:17 +0000 (09:21 +0200)]
repository: make check if repo is a worktree more strict

To determine if a repository is a worktree or not, we currently check
for the existence of a "gitdir" file inside of the repository's gitdir.
While this is sufficient for non-broken repositories, we have at least
one case of a subtly broken repository where there exists a gitdir file
inside of a gitmodule. This will cause us to misidentify the submodule
as a worktree.

While this is not really a fault of ours, we can do better here by
observing that a repository can only ever be a worktree iff its common
directory and dotgit directory are different. This allows us to make our
check whether a repo is a worktree or not more strict by doing a simple
string comparison of these two directories. This will also allow us to
do the right thing in the above case of a broken repository, as for
submodules these directories will be the same. At the same time, this
allows us to skip the `stat` check for the "gitdir" file for most
repositories.

7 years agorepository: factor out worktree check
Patrick Steinhardt [Fri, 19 May 2017 06:59:46 +0000 (08:59 +0200)]
repository: factor out worktree check

The check whether a repository is a worktree or not is currently done
inside of `git_repository_open_ext`. As we want to extend this function
later on, pull it out into its own function `repo_is_worktree` to ease
working on it.

7 years agorepository: improve parameter names for `find_repo`
Patrick Steinhardt [Fri, 19 May 2017 06:38:47 +0000 (08:38 +0200)]
repository: improve parameter names for `find_repo`

The out-parameters of `find_repo` containing found paths of a repository
are a tad confusing, as they are not as obvious as they could be. Rename
them like following to ease reading the code:

- `repo_path` -> `gitdir_path`
- `parent_path` -> `workdir_path`
- `link_path` -> `gitlink_path`
- `common_path` -> `commondir_path`

7 years agorepository: clear out-parameter instead of freeing it
Patrick Steinhardt [Fri, 19 May 2017 06:34:32 +0000 (08:34 +0200)]
repository: clear out-parameter instead of freeing it

The `path` out-parameter of `find_repo` is being sanitized initially
such that we do not try to append to existing content. The sanitization
is done via `git_buf_free`, though, which forces us to needlessly
reallocate the buffer later in the function. Fix this by using
`git_buf_clear` instead.

7 years agoFix issue with directory glob ignore in subdirectories
Robert Gay [Sun, 14 May 2017 17:28:05 +0000 (10:28 -0700)]
Fix issue with directory glob ignore in subdirectories

7 years agotests: add test suite for opening submodules
Patrick Steinhardt [Wed, 17 May 2017 07:23:06 +0000 (09:23 +0200)]
tests: add test suite for opening submodules

7 years agoMerge pull request #4240 from pks-t/pks/fix-gcc-warnings
Carlos Martín Nieto [Tue, 16 May 2017 16:02:13 +0000 (18:02 +0200)]
Merge pull request #4240 from pks-t/pks/fix-gcc-warnings

Fix GCC warnings

7 years agotests: threads::basic: remove unused function `exit_abruptly`
Patrick Steinhardt [Wed, 3 May 2017 11:53:13 +0000 (13:53 +0200)]
tests: threads::basic: remove unused function `exit_abruptly`

7 years agotests: clone::local: compile UNC functions for Windows only
Patrick Steinhardt [Wed, 3 May 2017 11:52:55 +0000 (13:52 +0200)]
tests: clone::local: compile UNC functions for Windows only

7 years agoodb: fix printf formatter for git_off_t
Patrick Steinhardt [Wed, 3 May 2017 10:38:55 +0000 (12:38 +0200)]
odb: fix printf formatter for git_off_t

The fields `declared_size` and `received_bytes` of the `git_odb_stream`
are both of type `git_off_t` which is defined as a signed integer. When
passing these values to a printf-style string in
`git_odb_stream__invalid_length`, though, we format these as PRIuZ,
which is unsigned.

Fix the issue by using PRIdZ instead, silencing warnings on macOS.

7 years agoexamples: network: refactor credentials callback
Patrick Steinhardt [Wed, 3 May 2017 10:25:48 +0000 (12:25 +0200)]
examples: network: refactor credentials callback

The credentials callback reads the username and password via scanf into
fixed-length arrays. While these are simply examples and as such not as
interesting, the unchecked return value of scanf causes GCC to emit
warnings. So while we're busy to shut up GCC, we also fix the possible
overflow of scanf by using getline instead.

7 years agoodb: shut up gcc warnings regarding uninitilized variables
Patrick Steinhardt [Wed, 3 May 2017 10:15:12 +0000 (12:15 +0200)]
odb: shut up gcc warnings regarding uninitilized variables

The `error` variable is used as a return value in the out-section of
both `odb_read_1` and `read_prefix_1`. While the value will actually
always be initialized inside of this section, GCC fails to realize this
due to interactions with the `found` variable: if `found` is set, the
error will always be initialized. If it is not, we return early without
reaching the out-statements.

Shut up the warnings by initializing the error variable, even though it
is unnecessary.

7 years agoMerge pull request #4238 from libgit2/ethomson/vs_to_vsts
Carlos Martín Nieto [Thu, 11 May 2017 19:22:20 +0000 (21:22 +0200)]
Merge pull request #4238 from libgit2/ethomson/vs_to_vsts

Update README: VS -> VSTS

7 years agoUpdate README: VS -> VSTS
Edward Thomson [Thu, 11 May 2017 18:56:55 +0000 (13:56 -0500)]
Update README: VS -> VSTS

libgit2 is no longer used in Visual Studio Team Services, it's used in
Visual Studio Team Services.

7 years agorevparse: support open-ended ranges
William Bain [Wed, 3 May 2017 17:20:57 +0000 (11:20 -0600)]
revparse: support open-ended ranges

Support '..' and '...' ranges where one side is not specified.
The unspecified side defaults to HEAD.

Closes #4223

7 years agoworktree: switch over worktree pruning to an opts structure
Patrick Steinhardt [Tue, 2 May 2017 10:35:59 +0000 (12:35 +0200)]
worktree: switch over worktree pruning to an opts structure

The current signature of `git_worktree_prune` accepts a flags field to
alter its behavior. This is not as flexible as we'd like it to be when
we want to enable passing additional options in the future. As the
function has not been part of any release yet, we are still free to
alter its current signature. This commit does so by using our usual
pattern of an options structure, which is easily extendable without
breaking the API.

7 years agoworktree: support creating locked worktrees
Patrick Steinhardt [Tue, 2 May 2017 08:11:28 +0000 (10:11 +0200)]
worktree: support creating locked worktrees

When creating a new worktree, we do have a potential race with us
creating the worktree and another process trying to delete the same
worktree as it is being created. As such, the upstream git project has
introduced a flag `git worktree add --locked`, which will cause the
newly created worktree to be locked immediately after its creation. This
mitigates the race condition.

We want to be able to mirror the same behavior. As such, a new flag
`locked` is added to the options structure of `git_worktree_add` which
allows the user to enable this behavior.

7 years agoMerge pull request #4232 from pks-t/pks/schroot-test-fixes
Edward Thomson [Thu, 4 May 2017 09:20:33 +0000 (10:20 +0100)]
Merge pull request #4232 from pks-t/pks/schroot-test-fixes

tests: repo: fix repo discovery tests on overlayfs

7 years agotests: repo: fix repo discovery tests on overlayfs
Patrick Steinhardt [Wed, 3 May 2017 12:51:23 +0000 (14:51 +0200)]
tests: repo: fix repo discovery tests on overlayfs

Debian and Ubuntu often use schroot to build their DEB packages in a
controlled environment. Depending on how schroot is configured, our
tests regarding repository discovery break due to not being able to find
the repositories anymore. It turns out that these errors occur when the
schroot is configured to use an overlayfs on the directory structures.

The reason for this failure is that we usually refrain from discovering
repositories across devices. But unfortunately, overlayfs does not have
consistent device identifiers for all its files but will instead use the
device number of the filesystem the file stems from. So whenever we
cross boundaries between the upper and lower layer of the overlay, we
will fail to properly detect the repository and bail out.

This commit fixes the issue by enabling cross-device discovery in our
tests. While it would be preferable to have this turned off, it probably
won't do much harm anyway as we set up our tests in a temporary location
outside of the parent repository.

7 years agoMerge pull request #4229 from pks-t/pks/ssh-memleaks
Edward Thomson [Tue, 2 May 2017 15:03:41 +0000 (16:03 +0100)]
Merge pull request #4229 from pks-t/pks/ssh-memleaks

libssh2 shutdown

7 years agotransports: ssh: clean up after libssh2 on exit
Patrick Steinhardt [Tue, 2 May 2017 11:37:15 +0000 (13:37 +0200)]
transports: ssh: clean up after libssh2 on exit

After calling `libssh2_init`, we need to clean up after the library by
executing `libssh2_exit` as soon as we exit. Register a shutdown handler
to do so which simply calls `libssh2_exit`. This fixes several memory
leaks.

7 years agotransports: ssh: report failure initializing libssh2
Patrick Steinhardt [Tue, 2 May 2017 11:35:09 +0000 (13:35 +0200)]
transports: ssh: report failure initializing libssh2

We unconditionally return success when initializing libssh2, regardless
of whether `libgssh2_init` signals success or an error. Fix this by
checking its return code.

7 years agoworktree: introduce git_worktree_add options
Patrick Steinhardt [Tue, 2 May 2017 08:02:36 +0000 (10:02 +0200)]
worktree: introduce git_worktree_add options

The `git_worktree_add` function currently accepts only a path and name
for the new work tree. As we may want to expand these parameters in
future versions without adding additional parameters to the function for
every option, this commit introduces our typical pattern of an options
struct. Right now, this structure is still empty, which will change with
the next commit.

7 years agoMerge pull request #4226 from libgit2/ethomson/memleak
Edward Thomson [Tue, 2 May 2017 08:25:20 +0000 (09:25 +0100)]
Merge pull request #4226 from libgit2/ethomson/memleak

WIP: squash some memleaks

7 years agoobject validation: free some memleaks
Edward Thomson [Mon, 1 May 2017 20:34:21 +0000 (21:34 +0100)]
object validation: free some memleaks

7 years agosignature: free dup'd buffers on parse error
Edward Thomson [Mon, 1 May 2017 20:32:24 +0000 (21:32 +0100)]
signature: free dup'd buffers on parse error

7 years agoremote: free the config snapshot
Edward Thomson [Mon, 1 May 2017 18:34:04 +0000 (19:34 +0100)]
remote: free the config snapshot

This reverts commit 5552237 and frees the snapshot properly.

7 years agoworktrees: cleanup some memory leaks
Edward Thomson [Mon, 1 May 2017 17:56:55 +0000 (18:56 +0100)]
worktrees: cleanup some memory leaks

Be sure to clean up looked up references.  Free buffers instead of
merely clearing them.  Use `git__free` instead of `free`.

7 years agoMerge pull request #4197 from pks-t/pks/verify-object-hashes
Edward Thomson [Mon, 1 May 2017 15:17:48 +0000 (16:17 +0100)]
Merge pull request #4197 from pks-t/pks/verify-object-hashes

Verify object hashes

7 years agoMerge pull request #4206 from libgit2/cmn/transport-get-proxy
Edward Thomson [Mon, 1 May 2017 15:11:56 +0000 (16:11 +0100)]
Merge pull request #4206 from libgit2/cmn/transport-get-proxy

transport: provide a getter for the proxy options

7 years agoMerge pull request #4216 from pks-t/pks/debian-test-failures
Edward Thomson [Mon, 1 May 2017 15:10:50 +0000 (16:10 +0100)]
Merge pull request #4216 from pks-t/pks/debian-test-failures

Debian HTTPS feature test failure

7 years agoMerge branch 'pr/4225'
Edward Thomson [Mon, 1 May 2017 14:23:54 +0000 (15:23 +0100)]
Merge branch 'pr/4225'

7 years agogit_remote_push: document that NULL refspecs allowed
Edward Thomson [Mon, 1 May 2017 14:23:27 +0000 (15:23 +0100)]
git_remote_push: document that NULL refspecs allowed

7 years agoMerge pull request #4224 from yuyichao/push-free-config
Edward Thomson [Mon, 1 May 2017 14:19:41 +0000 (15:19 +0100)]
Merge pull request #4224 from yuyichao/push-free-config

Do not free config when creating remote

7 years agoAllow NULL refspec in git_remote_push
Yichao Yu [Sat, 29 Apr 2017 17:00:07 +0000 (13:00 -0400)]
Allow NULL refspec in git_remote_push

Since this is allowed in `git_remote_upload`

7 years agoDo not free config when creating remote
Yichao Yu [Sat, 29 Apr 2017 16:28:35 +0000 (12:28 -0400)]
Do not free config when creating remote

The regression was introduced in 22261344de18b3cc60ee6937468d66a6a6a28875

7 years agoodb: verify hashes in read_prefix_1
Patrick Steinhardt [Fri, 28 Apr 2017 12:05:15 +0000 (14:05 +0200)]
odb: verify hashes in read_prefix_1

While the function reading an object from the complete OID already
verifies OIDs, we do not yet do so for reading objects from a partial
OID. Do so when strict OID verification is enabled.

7 years agoodb: improve error handling in read_prefix_1
Patrick Steinhardt [Fri, 28 Apr 2017 12:03:54 +0000 (14:03 +0200)]
odb: improve error handling in read_prefix_1

The read_prefix_1 function has several return statements springled
throughout the code. As we have to free memory upon getting an error,
the free code has to be repeated at every single retrun -- which it is
not, so we have a memory leak here.

Refactor the code to use the typical `goto out` pattern, which will free
data when an error has occurred. While we're at it, we can also improve
the error message thrown when multiple ambiguous prefixes are found. It
will now include the colliding prefixes.

7 years agoodb: add option to turn off hash verification
Patrick Steinhardt [Fri, 21 Apr 2017 07:31:56 +0000 (07:31 +0000)]
odb: add option to turn off hash verification

Verifying hashsums of objects we are reading from the ODB may be costly
as we have to perform an additional hashsum calculation on the object.
Especially when reading large objects, the penalty can be as high as
35%, as can be seen when executing the equivalent of `git cat-file` with
and without verification enabled. To mitigate for this, we add a global
option for libgit2 which enables the developer to turn off the
verification, e.g. when he can be reasonably sure that the objects on
disk won't be corrupted.

7 years agoodb: verify object hashes
Patrick Steinhardt [Mon, 10 Apr 2017 07:30:08 +0000 (09:30 +0200)]
odb: verify object hashes

The upstream git.git project verifies objects when looking them up from
disk. This avoids scenarios where objects have somehow become corrupt on
disk, e.g. due to hardware failures or bit flips. While our mantra is
usually to follow upstream behavior, we do not do so in this case, as we
never check hashes of objects we have just read from disk.

To fix this, we create a new error class `GIT_EMISMATCH` which denotes
that we have looked up an object with a hashsum mismatch. `odb_read_1`
will then, after having read the object from its backend, hash the
object and compare the resulting hash to the expected hash. If hashes do
not match, it will return an error.

This obviously introduces another computation of checksums and could
potentially impact performance. Note though that we usually perform I/O
operations directly before doing this computation, and as such the
actual overhead should be drowned out by I/O. Running our test suite
seems to confirm this guess. On a Linux system with best-of-five
timings, we had 21.592s with the check enabled and 21.590s with the
ckeck disabled. Note though that our test suite mostly contains very
small blobs only. It is expected that repositories with bigger blobs may
notice an increased hit by this check.

In addition to a new test, we also had to change the
odb::backend::nonrefreshing test suite, which now triggers a hashsum
mismatch when looking up the commit "deadbeef...". This is expected, as
the fake backend allocated inside of the test will return an empty
object for the OID "deadbeef...", which will obviously not hash back to
"deadbeef..." again. We can simply adjust the hash to equal the hash of
the empty object here to fix this test.

7 years agotests: object: test looking up corrupted objects
Patrick Steinhardt [Mon, 10 Apr 2017 07:00:51 +0000 (09:00 +0200)]
tests: object: test looking up corrupted objects

We currently have no tests which check whether we fail reading corrupted
objects. Add one which modifies contents of an object stored on disk and
then tries to read the object.

7 years agotests: object: create sandbox
Patrick Steinhardt [Mon, 10 Apr 2017 07:27:04 +0000 (09:27 +0200)]
tests: object: create sandbox

The object::lookup tests do use the "testrepo.git" repository in a
read-only way, so we do not set up the repository as a sandbox but
simply open it. But in a future commit, we will want to test looking up
objects which are corrupted in some way, which requires us to modify the
on-disk data. Doing this in a repository without creating the sandbox
will modify contents of our libgit2 repository, though.

Create the repository in a sandbox to avoid this.

7 years agotests: odb: make hash of fake backend configurable
Patrick Steinhardt [Mon, 10 Apr 2017 08:31:22 +0000 (10:31 +0200)]
tests: odb: make hash of fake backend configurable

In the odb::backend::nonrefreshing test suite, we set up a fake backend
so that we are able to determine if backend functions are called
correctly. During the setup, we also parse an OID which is later on used
to read out the pseudo-object. While this procedure works right now, it
will create problems later when we implement hash verification for
looked up objects. The current OID ("deadbeef") will not match the hash
of contents we give back to the ODB layer and thus cannot be verified.

Make the hash configurable so that we can simply switch the returned for
single tests.

7 years agoMerge pull request #4191 from pks-t/pks/wt-ref-renames
Edward Thomson [Fri, 28 Apr 2017 10:58:49 +0000 (11:58 +0100)]
Merge pull request #4191 from pks-t/pks/wt-ref-renames

Branch renames with worktrees

7 years agoMerge pull request #4219 from pks-t/pks/socket-stream-addrinfo-loop
Edward Thomson [Wed, 26 Apr 2017 16:09:53 +0000 (09:09 -0700)]
Merge pull request #4219 from pks-t/pks/socket-stream-addrinfo-loop

socket_stream: continue to next addrinfo on socket creation failure

7 years agoMerge pull request #4217 from pks-t/pks/readonly-cfg-backend
Edward Thomson [Wed, 26 Apr 2017 16:08:51 +0000 (09:08 -0700)]
Merge pull request #4217 from pks-t/pks/readonly-cfg-backend

Honor read-only flag when writing to config backends

7 years agosocket_stream: continue to next addrinfo on socket creation failure
Patrick Steinhardt [Wed, 26 Apr 2017 10:09:57 +0000 (12:09 +0200)]
socket_stream: continue to next addrinfo on socket creation failure

When connecting to a remote via socket stream, we first use getaddrinfo
to obtain the possible connection methods followed by creating and
connecting the socket. But when creating the socket, we error out as
soon as we get an invalid socket instead of trying out other address
hints returned by addrinfo.

Fix this by continuing on invalid socket instead of returning an error.
This fixes connection establishment with musl libc.

7 years agotests: config: verify functionality with read-only backends
Patrick Steinhardt [Tue, 25 Apr 2017 11:23:04 +0000 (13:23 +0200)]
tests: config: verify functionality with read-only backends

7 years agoconfig: skip r/o backends when writing
Patrick Steinhardt [Tue, 25 Apr 2017 10:40:13 +0000 (12:40 +0200)]
config: skip r/o backends when writing

Configuration backends have a readonly-flag which is currently used to
distinguish configuration snapshots. But somewhat unexpectedly, we do
not use the flag to prevent writing to a readonly backend but happily
proceed to do so.

This commit modifies logic to also honor the readonly flag for
configuration setters. We will now traverse through all backends and
pick the first one which is not marked as read-only whenever we want to
write new configuration.

7 years agoMerge pull request #4215 from pks-t/pks/diff-stack-free
Edward Thomson [Tue, 25 Apr 2017 14:10:33 +0000 (07:10 -0700)]
Merge pull request #4215 from pks-t/pks/diff-stack-free

diff_parse: free object instead of its pointer

7 years agoconfig_file: add missing include for `git_config_backend`
Patrick Steinhardt [Tue, 25 Apr 2017 10:59:48 +0000 (12:59 +0200)]
config_file: add missing include for `git_config_backend`

The config_file.h header provides some inline declarations accessing the
`git_config_backend`, but misses its declaration. Add the missing
include for "git2/sys/config.h" to add it.

7 years agotests: core::features: only check for HTTPS if it is supported
Patrick Steinhardt [Tue, 25 Apr 2017 08:14:37 +0000 (10:14 +0200)]
tests: core::features: only check for HTTPS if it is supported

7 years agocmake: define GIT_HTTPS when HTTPS is supported
Patrick Steinhardt [Tue, 25 Apr 2017 08:14:19 +0000 (10:14 +0200)]
cmake: define GIT_HTTPS when HTTPS is supported

7 years agodiff_parse: free object instead of its pointer
Patrick Steinhardt [Tue, 25 Apr 2017 07:48:59 +0000 (09:48 +0200)]
diff_parse: free object instead of its pointer

In e7330016a (diff_parse: check return value of `git_diff_init_options`,
2017-03-20), we've introduced an error check whether we're able to
correctly initialize the diff options. This simple commit actually
introduced a segfault in that we now try to free the pointer to the
allocated diff in an error case, instead of the allocated diff itself.
This commit fixes the issue.

7 years agoMerge pull request #4210 from pks-t/pks/misc-fixes
Patrick Steinhardt [Fri, 21 Apr 2017 13:39:03 +0000 (15:39 +0200)]
Merge pull request #4210 from pks-t/pks/misc-fixes

Misc fixes

7 years agotests: threads::diff: fix warning for unused variable
Patrick Steinhardt [Fri, 21 Apr 2017 07:49:08 +0000 (07:49 +0000)]
tests: threads::diff: fix warning for unused variable

The threads::diff test suite has a static variable `_retries`, which is
used on Windows platforms only. As it is unused on other systems, the
compiler throws a warning there. Fix the warning by wrapping the
declaration in an ifdef.

7 years agoglobal: fix typo in `git_libgit2_init` description
Patrick Steinhardt [Fri, 21 Apr 2017 07:09:59 +0000 (07:09 +0000)]
global: fix typo in `git_libgit2_init` description

7 years agoMerge pull request #4192 from libgit2/ethomson/win32_posix
Carlos Martín Nieto [Mon, 17 Apr 2017 15:19:03 +0000 (17:19 +0200)]
Merge pull request #4192 from libgit2/ethomson/win32_posix

Refactor some of the win32 POSIX emulation

7 years agowin32: `remediation` not `cleanup`
Edward Thomson [Mon, 17 Apr 2017 14:40:03 +0000 (15:40 +0100)]
win32: `remediation` not `cleanup`

The `remediation` function is run in the retry loop in order to attempt
to fix any problems that the prior run encountered.  There is nothing
"cleaned up".  Clarify the name.

7 years agotransport: provide a getter for the proxy options
Carlos Martín Nieto [Mon, 17 Apr 2017 11:03:03 +0000 (13:03 +0200)]
transport: provide a getter for the proxy options

As with the callbacks, third-party implementations of smart subtransports cannot
reach into the opaque struct and thus cannot know what options the user set.

Add a getter for these options to copy the proxy options into something external
implementors can use.

7 years agoMerge pull request #4201 from pks-t/pks/fileops-fd-leak
Edward Thomson [Wed, 12 Apr 2017 08:21:26 +0000 (09:21 +0100)]
Merge pull request #4201 from pks-t/pks/fileops-fd-leak

fileops: fix leaking fd in `mmap_ro_file`

7 years agofileops: fix leaking fd in `mmap_ro_file`
Patrick Steinhardt [Wed, 12 Apr 2017 06:09:08 +0000 (08:09 +0200)]
fileops: fix leaking fd in `mmap_ro_file`

When the `git_futils_mmap_ro_file` function encounters an error after
the file has been opened, it will do a simple returns. Instead, we
should close the opened file descriptor to avoid a leak. This commit
fixes the issue.

7 years agoMerge pull request #4196 from pks-t/pks/filter-segfault
Edward Thomson [Tue, 11 Apr 2017 18:18:05 +0000 (19:18 +0100)]
Merge pull request #4196 from pks-t/pks/filter-segfault

filter: only close filter if it's been initialized correctly

7 years agoMerge pull request #4195 from pks-t/pks/openssl-1.1
Edward Thomson [Tue, 11 Apr 2017 18:17:11 +0000 (19:17 +0100)]
Merge pull request #4195 from pks-t/pks/openssl-1.1

Fix building against OpenSSL v1.1

7 years agoMerge pull request #4198 from pks-t/pks/git-compat
Edward Thomson [Tue, 11 Apr 2017 18:10:28 +0000 (19:10 +0100)]
Merge pull request #4198 from pks-t/pks/git-compat

README: document our relation to changes in upstream

7 years agoREADME: document our relation to changes in upstream
Patrick Steinhardt [Mon, 10 Apr 2017 10:01:28 +0000 (12:01 +0200)]
README: document our relation to changes in upstream

libgit2 is a mere consumer of changes which are trickling down from the
upstream git.git project. This commit documents the ramifications caused
by this relation.

7 years agoopenssl_stream: use new initialization function on OpenSSL version >=1.1
Patrick Steinhardt [Fri, 7 Apr 2017 11:02:50 +0000 (13:02 +0200)]
openssl_stream: use new initialization function on OpenSSL version >=1.1

Previous to OpenSSL version 1.1, the user had to initialize at least the error
strings as well as the SSL algorithms by himself. OpenSSL version 1.1 instead
provides a new function `OPENSSL_init_ssl`, which handles initialization of all
subsystems. As the new API call will by default load error strings and
initialize the SSL algorithms, we can safely replace these calls when compiling
against version 1.1 or later.

This fixes a compiler error when compiling against OpenSSL version 1.1 which has
been built without stubs for deprecated syntax.

7 years agoopenssl_stream: remove locking initialization on OpenSSL version >=1.1
Patrick Steinhardt [Fri, 7 Apr 2017 10:54:33 +0000 (12:54 +0200)]
openssl_stream: remove locking initialization on OpenSSL version >=1.1

Up to version 1.0, OpenSSL required us to provide a callback which implements
a locking mechanism. Due to problems in the API design though this mechanism was
inherently broken, especially regarding that the locking callback cannot report
errors in an obvious way. Due to this shortcoming, the locking initialization
has been completely removed in OpenSSL version 1.1. As the library has also been
refactored to not make any use of these callback functions, we can safely remove
all initialization of the locking subsystem if compiling against OpenSSL version
1.1 or higher.

This fixes a compilation error when compiling against OpenSSL version 1.1 which
has been built without stubs for deprecated syntax.

7 years agofilter: only close filter if it's been initialized correctly
Patrick Steinhardt [Fri, 7 Apr 2017 14:05:10 +0000 (16:05 +0200)]
filter: only close filter if it's been initialized correctly

In the function `git_filter_list_stream_data`, we initialize, write and
subesquently close the stream which should receive content processed by
the filter. While we skip writing to the stream if its initialization
failed, we still try to close it unconditionally -- even if the
initialization failed, where the stream might not be set at all, leading
us to segfault.

Semantics in this code is not really clear. The function handling the
same logic for files instead of data seems to do the right thing here in
only closing the stream when initialization succeeded. When stepping
back a bit, this is only reasonable: if a stream cannot be initialized,
the caller would not expect it to be closed again. So actually, both
callers of `stream_list_init` fail to do so. The data streaming function
will always close the stream and the file streaming function will not
close the stream if writing to it has failed.

The fix is thus two-fold:

- callers of `stream_list_init` now close the stream iff it has been
  initialized
- `stream_list_init` now closes the lastly initialized stream if
  the current stream in the chain failed to initialize

Add a test which segfaulted previous to these changes.

7 years agoMerge pull request #4183 from pks-t/pks/coverity
Edward Thomson [Fri, 7 Apr 2017 08:03:56 +0000 (09:03 +0100)]
Merge pull request #4183 from pks-t/pks/coverity

Coverity

7 years agoMerge pull request #4193 from pks-t/pks/libdir
Edward Thomson [Fri, 7 Apr 2017 08:02:54 +0000 (09:02 +0100)]
Merge pull request #4193 from pks-t/pks/libdir

pkgconfig: fix handling of prefixes containing whitespaces

7 years agopkgconfig: fix handling of prefixes containing whitespaces
Patrick Steinhardt [Wed, 5 Apr 2017 12:39:05 +0000 (14:39 +0200)]
pkgconfig: fix handling of prefixes containing whitespaces

Our libgit2.pc.in file is quoting the `libdir` variable in our declared
"Libs:" line. The intention is to handle whitespaces here, but pkgconfig
already does so by automatically escaping whitespace with backslashes.
The correct thing to do is to instead quote the prefix, as this is the
one which is being substituted by CMake upon installation. As both
libdir and includedir will be expanded to "${prefix}/lib" and
"${prefix}/include", respectively, pkgconfig will also correctly escape
whitespaces.

Note that this will actually break when a user manually wants to
override libdir and includedir with a path containing whitespace. But
actually, this cannot be helped, as always quoting these variables will
actuall break the common case of being prefixed with "${prefix}". So we
just bail out here and declare this as unsupported out of the box.

7 years agorefs: update worktree HEADs when renaming branches
Patrick Steinhardt [Tue, 4 Apr 2017 16:55:57 +0000 (18:55 +0200)]
refs: update worktree HEADs when renaming branches

Whenever we rename a branch, we update the repository's symbolic HEAD
reference if it currently points to the branch that is to be renamed.
But with the introduction of worktrees, we also have to iterate over all
HEADs of linked worktrees to adjust them. Do so.

7 years agobranch: use `foreach_head` to see if a branch is checked out
Patrick Steinhardt [Tue, 4 Apr 2017 16:44:43 +0000 (18:44 +0200)]
branch: use `foreach_head` to see if a branch is checked out

Previously, we have extracted the logic to find and iterate over all
HEADs of a repository. Use this function in `git_branch_is_checked_out`.

7 years agorepository: add function to iterate over all HEADs
Patrick Steinhardt [Tue, 4 Apr 2017 16:44:29 +0000 (18:44 +0200)]
repository: add function to iterate over all HEADs

While we already provide functions to get the current repository's HEAD,
it is quite involved to iterate over HEADs of both the repository and
all linked work trees. This commit implements a function
`git_repository_foreach_head`, which accepts a callback which is then
called for all HEAD files.

7 years agorepository: get worktree HEAD via `git_reference__read_head`
Patrick Steinhardt [Wed, 5 Apr 2017 11:47:09 +0000 (13:47 +0200)]
repository: get worktree HEAD via `git_reference__read_head`

The functions `git_repository_head_for_worktree` and
`git_repository_detached_head_for_worktree` both implement their
own logic to read the HEAD reference file. Use the new function
`git_reference__read_head` instead to unify the code paths.

7 years agorepository: extract function to get path to a file in a work tree
Patrick Steinhardt [Tue, 4 Apr 2017 15:12:22 +0000 (17:12 +0200)]
repository: extract function to get path to a file in a work tree

The function `read_worktree_head` has the logic embedded to construct
the path to `HEAD` in the work tree's git directory, which is quite
useful for other callers. Extract the logic into its own function to
make it reusable by others.

7 years agorepository: set error message if trying to set HEAD to a checked out one
Patrick Steinhardt [Tue, 4 Apr 2017 16:18:45 +0000 (18:18 +0200)]
repository: set error message if trying to set HEAD to a checked out one

If trying to set the HEAD of a repository to another reference, we have
to check whether this reference is already checked out in another linked
work tree. If it is, we will refuse setting the HEAD and return an
error, but do not set a meaningful error message. Add one.

7 years agorefs: implement function to read references from file
Patrick Steinhardt [Wed, 5 Apr 2017 08:43:18 +0000 (10:43 +0200)]
refs: implement function to read references from file

Currently, we only provide functions to read references directly from a
repository's reference store via e.g. `git_reference_lookup`. But in
some cases, we may want to read files not connected to the current
repository, e.g. when looking up HEAD of connected work trees. This
commit implements `git_reference__read_head`, which will read out and
allocate a reference at an arbitrary path.

7 years agotests: worktree::refs: convert spaces to tabs
Patrick Steinhardt [Tue, 4 Apr 2017 14:12:27 +0000 (16:12 +0200)]
tests: worktree::refs: convert spaces to tabs

7 years agowin32: only set `git_win32__retries` where it exists
Edward Thomson [Wed, 5 Apr 2017 10:59:03 +0000 (11:59 +0100)]
win32: only set `git_win32__retries` where it exists

7 years agowin32: enable `p_utimes` for readonly files
Edward Thomson [Wed, 5 Apr 2017 08:50:12 +0000 (09:50 +0100)]
win32: enable `p_utimes` for readonly files

Instead of failing to set the timestamp of a read-only file (like any
object file), set it writable temporarily to update the timestamp.

7 years agofileops: do not overwrite correct error message on mmap
Patrick Steinhardt [Tue, 28 Mar 2017 08:12:23 +0000 (10:12 +0200)]
fileops: do not overwrite correct error message on mmap

When executing `git_futils_mmap_ro_file`, we first try to guess whether
the file is mmapable at all. Part of this check is whether the file is
too large to be mmaped, which can be true on systems with 32 bit
`size_t` types.

The check is performed by first getting the file size wtih
`git_futils_filesize` and then checking whether the returned size can be
represented as `size_t`, returning an error if so. While this test also
catches the case where the function returned an error (as `-1` is not
representable by `size_t`), we will set the misleading error message
"file too large to mmap". But in fact, a negative return value from
`git_futils_filesize` will be caused by the inability to fstat the file.

Fix the error message by handling negative return values separately and
not overwriting the error message in that case.

7 years agoblame_git: check return value of `git__calloc`
Patrick Steinhardt [Tue, 28 Mar 2017 07:15:53 +0000 (09:15 +0200)]
blame_git: check return value of `git__calloc`

We do not check the return value of `git__calloc`, which may return
`NULL` in out-of-memory situations. Fix the error by using
`GITERR_CHECK_ALLOC`.

7 years agopath: short-circuit `git_path_apply_relative` on error
Patrick Steinhardt [Tue, 28 Mar 2017 07:12:34 +0000 (09:12 +0200)]
path: short-circuit `git_path_apply_relative` on error

Short-circuit the call to `git_path_resolve_relative` in case
`git_buf_joinpath` returns an error. While this does not fix any
immediate errors, the resulting code is easier to read and handles
potential new error conditions raised by `git_buf_joinpath`.