| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
`git_checkout_head` is sadly misunderstood as something that can
switch branches. It cannot. Update the documentation to reflect this.
|
|\
| |
| | |
Memory leak fixes
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The thread local storage is used to hold some global state that
is dynamically allocated and should be freed upon exit. On
Windows, we clean up the C run-time right after execution of
registered shutdown callbacks and before cleaning up the TLS.
When we clean up the CRT, we also cause it to analyze for memory
leaks. As we did not free the TLS yet this will lead to false
positives.
Fix the issue by first freeing the TLS and cleaning up the CRT
only afterwards.
|
| | |
|
|\ \
| |/
|/| |
Fix invalid memory references
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When removing an entry from the index by its position, we first
retrieve the position from the index's entries and then try to
remove the retrieved value from the index map with
`DELETE_IN_MAP`. When `index_remove_entry` returns `NULL` we try
to feed it into the `DELETE_IN_MAP` macro, which will
unconditionally call `idxentry_hash` and then happily dereference
the `NULL` entry pointer.
Fix the issue by not passing a `NULL` entry into `DELETE_IN_MAP`.
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When we receive a packet of exactly four bytes encoding its
length as those four bytes it can be treated as an empty line.
While it is not really specified how those empty lines should be
treated, we currently ignore them and do not return an error when
trying to parse it but simply advance the data pointer.
Callers invoking `git_pkt_parse_line` are currently not prepared
to handle this case as they do not explicitly check this case.
While they could always reset the passed out-pointer to `NULL`
before calling `git_pkt_parse_line` and determine if the pointer
has been set afterwards, it makes more sense to update
`git_pkt_parse_line` to set the out-pointer to `NULL` itself when
it encounters such an empty packet. Like this it is guaranteed
that there will be no invalid memory references to free'd
pointers.
As such, the issue has been fixed such that `git_pkt_parse_line`
always sets the packet out pointer to `NULL` when an empty packet
has been received and callers check for this condition, skipping
such packets.
|
|\
| |
| | |
`git_index_read_index` fixes
|
| |
| |
| |
| |
| |
| | |
When adding a new entry to an existing index via `git_index_read_index`,
be sure to remove the tree cache entry for that new path. This will
mark all parent trees as dirty.
|
| |
| |
| |
| |
| | |
Test a rebase (both a merge rebase and an inmemory rebase) with a new
commit that adds files underneath a new subfolder.
|
| |
| |
| |
| |
| | |
Read a tree into an index, write the index, then re-open the index and
ensure that we are treesame to the original.
|
| |
| |
| |
| | |
Update the flags to reset the path_len (to emulate `index_insert`)
|
| |
| |
| |
| |
| | |
Treat index entries with different modes as different, which they
are, at least for the purposes of up-to-date calculations.
|
| |
| |
| |
| |
| |
| | |
Clear any error state upon each iteration. If one of the iterations
ends (with an error of `GIT_ITEROVER`) we need to reset that error to 0,
lest we stop the whole process prematurely.
|
|/
|
|
|
|
|
| |
Read a tree into an index using `git_index_read_index` (by reading
a tree into a new index, then reading that index into the current
index), then write the index back out, ensuring that our new index
is treesame to the tree that we read.
|
|\
| |
| | |
Preliminary Haiku port
|
| | |
|
|\ \
| | |
| | | |
cleanup: unused warning
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
It looks like we're getting the operation and not doing anything
with it, when in fact we are asserting that it's not null. Simply
assert that we are within the operation boundary instead of using
the `git_array_get` macro to do this for us.
|
| | | |
|
| | | |
|
|/ / |
|
|\ \
| | |
| | | |
Update CMakeLists.txt
|
|/ /
| |
| | |
typo fix
|
|\ \
| | |
| | | |
Use AppVeyor's Start-FileDownload cmdlet
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Start-FileDownload maintains current directory context and allows
specifying a request timeout, see [1].
[1] https://www.appveyor.com/docs/how-to/download-file#start-filedownload-cmdlet
|
|\ \ \
| | | |
| | | | |
test: Fix stat() test to mask out unwanted bits
|
| |/ /
| | |
| | |
| | | |
Haiku and Hurd both pass extra bits in struct stat::st_mode.
|
|\ \ \ |
|
| | | | |
|
|/ / /
| | |
| | |
| | |
| | | |
Don't generate conflicts when checking out a modified submodule and the
submodule is dirty or modified in the workdir.
|
|\ \ \
| |/ /
|/| | |
Fix comment for GIT_FILEMODE_LINK
|
| |/
| |
| |
| | |
0120000 is symbolic link, not commit
|
|\ \
| | |
| | | |
tree: handle removal of all entries in the updater
|
|/ /
| |
| |
| |
| | |
When we remove all entries in a tree, we should remove that tree from
its parent rather than include the empty tree.
|
|\ \
| |/
|/| |
Tree updater fixups
|
| | |
|
| |
| |
| |
| |
| |
| | |
When we want to remove the file, use the basename as the name of the
entry to remove, instead of the full one, which includes the directories
we've inserted into the stack.
|
|/
|
|
| |
This gives us trees with subdirectories, which the new test needs.
|
|\
| |
| | |
Add a method specifically for modifying trees
|
|/
|
|
|
|
|
|
|
|
|
| |
Instead of going through the usual steps of reading a tree recursively
into an index, modifying it and writing it back out as a tree, introduce
a function to perform simple updates more efficiently.
`git_tree_create_updated` avoids reading trees which are not modified
and supports upsert and delete operations. It is not as versatile as
modifying the index, but it makes some common operations much more
efficient.
|
|\
| |
| | |
Misc fixes
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When determining diffs between two iterators we may need to
recurse into an unmatched directory for the "new" iterator when
it is either a prefix to the current item of the "old" iterator
or when untracked/ignored changes are requested by the user and
the directory is untracked/ignored.
When advancing into the directory and no files are found, we will
get back `GIT_ENOTFOUND`. If so, we simply skip the directory,
handling resulting unmatched old items in the next iteration. The
other case of `iterator_advance_into` returning either
`GIT_NOERROR` or any other error but `GIT_ENOTFOUND` will be
handled by the caller, which will now either compare the first
directory entry of the "new" iterator in case of `GIT_ENOERROR`
or abort on other cases.
Improve readability of the code to make the above logic more
clear.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
We compute offsets by executing `off |= (*delta++ << 24)` for
multiple constants, where `off` is of type `size_t` and `delta`
is of type `unsigned char`. The usual arithmetic conversions (see
ISO C89 §3.2.1.5 "Usual arithmetic conversions") kick in here,
causing us to promote both operands to `int` and then extending
the result to an `unsigned long` when OR'ing it with `off`.
The integer promotion to `int` may result in wrong size
calculations for big values.
Fix the issue by making the constants `unsigned long`, causing both
operands to be promoted to `unsigned long`.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
An object's size is computed by reading the object header's size
field until the most significant bit is not set anymore. To get
the total size, we increase the shift on each iteration and add
the shifted value to the total size.
We read the current value into a variable of type `unsigned
char`, from which we then take all bits except the most
significant bit and shift the result. We will end up with a
maximum shift of 60, but this exceeds the width of the value's
type, resulting in undefined behavior.
Fix the issue by instead reading the values into a variable of
type `unsigned long`, which matches the required width. This is
equivalent to git.git, which uses an `unsigned long` as well.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When `git_repository__cvar` fails we may end up with a
`ignorecase` value of `-1`. As we subsequently check if
`ignorecase` is non-zero, we may end up reporting that data
should be removed when in fact it should not.
Err on the safer side and set `ignorecase = 0` when
`git_repository__cvar` fails.
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The `merge_file__xdiff` function checks if either `ours` or
`theirs` is `NULL`. The function is to be called with existing
files, though, and in fact already unconditionally dereferences
both pointers.
Remove the unnecessary check to silence warnings.
|
| | |
|