- 16 Apr, 2019 5 commits
-
-
Etienne Samson committed
-
Etienne Samson committed
-
Patrick Steinhardt committed
-
In some parts of our code, we make rather heavy use of casting structures to their respective specialized implementation. One example is the configuration code with the general `git_config_backend` and the specialized `diskfile_header` structures. At some occasions, it can get confusing though with regards to the correct inheritance structure, which led to the recent bug fixed in 2424e64c (config: harden our use of the backend objects a bit, 2018-02-28). Object-oriented programming in C is hard, but we can at least try to have some checks when it comes to casting around stuff. Thus, this commit introduces a `GIT_CONTAINER_OF` macro, which accepts as parameters the pointer that is to be casted, the pointer it should be cast to as well as the member inside of the target structure that is the containing structure. This macro then tries hard to detect mis-casts: - It checks whether the source and target pointers are of the same type. This requires support by the compiler, as it makes use of the builtin `__builtin_types_compatible_p`. - It checks whether the embedded member of the target structure is the first member. In order to make this a compile-time constant, the compiler-provided `__builtin_offsetof` is being used for this. - It ties these two checks together by the compiler-builtin `__builtin_choose_expr`. Based on whether the previous two checks evaluate to `true`, the compiler will either compile in the correct cast, or it will output `(void)0`. The second case results in a compiler error, resulting in a compile-time check for wrong casts. The only downside to this is that it relies heavily on compiler-specific extensions. As both GCC and Clang support these features, only define this macro like explained above in case `__GNUC__` is set (Clang also defines `__GNUC__`). If the compiler is not Clang or GCC, just go with a simple cast without any additional checks.
Patrick Steinhardt committed -
patch_parse.c: Handle CRLF in parse_header_start
Patrick Steinhardt committed
-
- 07 Apr, 2019 4 commits
-
-
fix typo
Edward Thomson committed -
cheese1 committed
-
sha1: don't inline `git_hash_global_init` for win32
Edward Thomson committed -
ignore: treat paths with trailing "/" as directories
Edward Thomson committed
-
- 06 Apr, 2019 1 commit
-
-
Drew DeVault committed
-
- 05 Apr, 2019 1 commit
-
-
The function `git_ignore_path_is_ignored` is there to test the ignore status of paths that need not necessarily exist inside of a repository. This has the implication that for a given path, we cannot always decide whether it references a directory or a file, and we need to distinguish those cases because ignore rules may treat those differently. E.g. given the following gitignore file: * !/**/ we'd only want to unignore directories, while keeping files ignored. But still, calling `git_ignore_path_is_ignored("dir/")` will say that this directory is ignored because it treats "dir/" as a file path. As said, the `is_ignored` function cannot always decide whether the given path is a file or directory, and thus it may produce wrong results in some cases. While this is unfixable in the general case, we can do better when we are being passed a path name with a trailing path separator (e.g. "dir/") and always treat them as directories.
Patrick Steinhardt committed
-
- 04 Apr, 2019 6 commits
-
-
Test that largefiles can be read through the tree API
Edward Thomson committed -
Tests for symlinked user config
Edward Thomson committed -
patch_parse: fix parsing addition/deletion of file with space
Edward Thomson committed -
Edward Thomson committed
-
Optimize string comparisons
Edward Thomson committed -
Users of the Win32 hash cannot be inlined, as it uses a static struct. Don't inline it, but continue to declare the function in the header.
Edward Thomson committed
-
- 29 Mar, 2019 11 commits
-
-
romkatv committed
-
Negation of subdir ignore causes other subdirs to be unignored
Patrick Steinhardt committed -
According to reports, libgit2 is unable to read a global configuration file that is simply a symlink to the real configuration. Write a (succeeding) test that shows that libgit2 _is_ correctly able to do so.
Patrick Steinhardt committed -
While we do verify that we are able to open the global ".gitconfig" file in config::global::open_global, we never verify that we it is in fact readable. Do so by writing the global configuration file and verifying that reading from it produces the expected values.
Patrick Steinhardt committed -
We've got reports that users are unable to open repos when their global configuration ("~/.gitconfig") is a symlink. Add a test to verify that we are in fact able to do so as expected.
Patrick Steinhardt committed -
Add a test that verifies that we are able to parse patches which add a new file that has spaces in its path.
Erik Aigner committed -
The diff header format is a strange beast in that it is inherently unparseable in an unambiguous way. While parsing a/file.txt b/file.txt is obvious and trivially doable, parsing a diff header of a/file b/file ab.txt b/file b/file ab.txt is not (but in fact valid and created by git.git). Due to that, we have relaxed our diff header parser in commit 80226b5f (patch_parse: allow parsing ambiguous patch headers, 2017-09-22), so that we started to bail out when seeing diff headers with spaces in their file names. Instead, we try to use the "---" and "+++" lines, which are unambiguous. In some cases, though, we neither have a useable file name from the header nor from the "---" or "+++" lines. This is the case when we have a deletion or addition of a file with spaces: the header is unparseable and the other lines will simply show "/dev/null". This trips our parsing logic when we try to extract the prefix (the "a/" part) that is being used in the path line, where we unconditionally try to dereference a NULL pointer in such a scenario. We can fix this by simply not trying to parse the prefix in cases where we have no useable path name. That'd leave the parsed patch without either `old_prefix` or `new_prefix` populated. But in fact such cases are already handled by users of the patch object, which simply opt to use the default prefixes in that case.
Patrick Steinhardt committed -
Patrick Steinhardt committed
-
xdiff: fix typo
Patrick Steinhardt committed -
The config::global test suite creates various different directories and files which are being populated with pretend-global files. Unfortunately, the tests do not clean up after themselves, which may cause subsequent tests to fail due to cruft left behind. Fix this by always removing created directories and their contents.
Patrick Steinhardt committed -
docs: clarify relation of safe and forced checkout strategy
Edward Thomson committed
-
- 25 Mar, 2019 2 commits
-
-
Erik Aigner committed
-
Each hash implementation should define `git_hash_global_init`
Edward Thomson committed
-
- 23 Mar, 2019 1 commit
-
-
This means the forward declaration isn't necessary. The forward declaration can cause compilation errors as it conflicts with the `GIT_INLINE` declaration (the signatures are different).
Aaron Patterson committed
-
- 20 Mar, 2019 2 commits
-
-
Steven King Jr committed
-
Stefan Widgren committed
-
- 15 Mar, 2019 1 commit
-
-
Steven King Jr committed
-
- 14 Mar, 2019 2 commits
-
-
Matching on the prefix of a negated pattern was triggering false negatives on siblings of that pattern. e.g. Given the .gitignore: dir/* !dir/sub1/sub2/** The path `dir/a.text` would not be ignored.
Steve King Jr committed -
When a directory's contents are ignored, and then a glob negation is made to a nested subdir, other subdirectories are now unignored
Tyler Ang-Wanek committed
-
- 06 Mar, 2019 1 commit
-
-
[Doc] Update URL to git2-rs
Edward Thomson committed
-
- 05 Mar, 2019 1 commit
-
-
Dominik Ritter committed
-
- 02 Mar, 2019 2 commits
-
-
remote: Rename git_remote_completion_type to _t
Edward Thomson committed -
odb: provide a free function for custom backends
Edward Thomson committed
-