summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* tree: deprecate `git_treebuilder_write_with_buffer`Edward Thomson2021-03-042-56/+68
| | | | | | | | | The function `git_treebuilder_write_with_buffer` is unnecessary; it is used internally as part of treebuilder writing, but it has little use to external callers. For callers that repeatedly write a treebuilder, we can supply them with a buffer in the treebuilder struct instead of recreating it. For ourselves, when we want a single buffer in our write loop, we can use an internal function.
* Merge pull request #5801 from mamapanda/patch-1Edward Thomson2021-02-211-5/+6
|\ | | | | index: Check git_vector_dup error in write_entries
| * index: Initialize case_sorted to GIT_VECTOR_INITpanda2021-02-181-5/+4
| | | | | | | | This is for extra safety within write_entries
| * index: Check git_vector_dup error in write_entriespanda2021-02-161-1/+3
| | | | | | | | If allocating case_sorted.contents fails, git_vector_sort will segfault.
* | refdb_fs: Check git_sortedcache wlock/rlock errorspanda2021-02-161-2/+4
|/ | | | | To prevent a race condition, these wlock/rlock calls should probably be checked for errors.
* Merge pull request #5731 from KOLANICH-libs/owner_accessorEdward Thomson2021-02-011-0/+5
|\ | | | | patch: add owner accessor
| * patch: add owner accessorJason Haslam2020-12-111-0/+5
| |
* | Merge pull request #5762 from lhchavez/cgraph-parserEdward Thomson2021-02-012-0/+366
|\ \ | | | | | | commit-graph: Introduce a parser for commit-graph files
| * | commit-graph: Introduce a parser for commit-graph fileslhchavez2021-01-102-0/+366
| | | | | | | | | | | | | | | | | | | | | | | | This change is the first in a series to add support for git's commit-graph. This should speed up commit graph traversals by avoiding object parsing and allowing some operations to terminate earlier. Part of: #5757
* | | Merge pull request #5786 from libgit2/ethomson/revparseEdward Thomson2021-02-012-4/+4
|\ \ \ | | | | | | | | revspec: rename git_revparse_mode_t to git_revspec_t
| * | | revspec: rename git_revparse_mode_t to git_revspec_tethomson/revparseEdward Thomson2021-01-312-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | The information about the type of a revision spec is not information about the parser. Name it accordingly, so that `git_revparse_mode_t` is now `git_revspec_t`. Deprecate the old name.
* | | | mwindow: Fix a bug in the LRU window finding codelhchavez2021-01-201-1/+3
|/ / / | | | | | | | | | | | | | | | | | | This change now updates the `lru_window` variable to match the current file's MRU window. This makes it such that it doesn't always choose the file that happened to come last in the list of window files, and instead should now correctly choose the file with the least-recently-used one.
* | | Merge pull request #5768 from lhchavez/midx-needs-refreshEdward Thomson2021-01-151-1/+1
|\ \ \ | | | | | | | | midx: Fix a bug in `git_midx_needs_refresh()`
| * | | midx: Fix a bug in `git_midx_needs_refresh()`lhchavez2021-01-071-1/+1
| | | | | | | | | | | | | | | | | | | | The very last check in the freshness check for the midx was wrong >< This was also because this function was not tested.
* | | | Merge pull request #5775 from libgit2/ethomson/clone_branchEdward Thomson2021-01-101-21/+42
|\ \ \ \ | | | | | | | | | | clone: set refs/remotes/origin/HEAD when branch is specified
| * | | | clone: set refs/remotes/origin/HEAD when branch is specifiedethomson/clone_branchEdward Thomson2021-01-071-21/+42
| |/ / / | | | | | | | | | | | | | | | | | | | | When a branch is specified to check out in clone, update the remote tracking `HEAD` to point to it. This mimics git's behavior, when `git clone -b <name>` is used.
* | | | Merge pull request #5769 from lhchavez/pwrite-preadEdward Thomson2021-01-073-11/+3
|\ \ \ \ | | | | | | | | | | Use `p_pwrite`/`p_pread` consistently throughout the codebase
| * | | | Use `p_pwrite`/`p_pread` consistently throughout the codebaselhchavez2021-01-073-11/+3
| |/ / / | | | | | | | | | | | | | | | | | | | | This change stops using the seek+read/write combo to perform I/O with an offset, since this is faster by one system call (and also more atomic and therefore safer).
* | | | repo: ignore empty init.defaultbranchethomson/empty_default_branchEdward Thomson2021-01-071-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | The init.defaultbranch option may be set, but empty. In this case, we should ignore it instead of trying to set our default branch to `refs/heads/`.
* | | | remote: don't update invalid refsEdward Thomson2021-01-071-0/+10
|/ / / | | | | | | | | | | | | If a symbolic reference points to something invalid, then do not try to update it.
* | | Merge pull request #5760 from libgit2/ethomson/tttoo_many_tttsEdward Thomson2021-01-071-1/+1
|\ \ \ | | | | | | | | blob: fix name of `GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD`
| * | | blob: fix name of `GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD`ethomson/tttoo_many_tttsEdward Thomson2021-01-051-1/+1
| |/ / | | | | | | | | | | | | | | | `GIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD` is misspelled, it should be `GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD`, and it would be if it were not for the MacBook Pro keyboard and my inattentiveness.
* | | Merge pull request #5759 from JoshuaS3/mastermasterEdward Thomson2021-01-061-0/+9
|\ \ \ | |/ / |/| | Add documentation for git_blob_filter_options.version
| * | blob: add git_blob_filter_options_initEdward Thomson2021-01-051-0/+9
| | | | | | | | | | | | | | | | | | The `git_blob_filter_options_init` function should be included, to allow callers in FFI environments to let us initialize an options structure for them.
* | | Merge pull request #5583 from 0xdky/dhruva/build-with-nommapEdward Thomson2021-01-055-9/+132
|\ \ \ | | | | | | | | Build with NO_MMAP
| * | | Support build with NO_MMAP to disable use of system mmapDhruva Krishnamurthy2020-12-305-5/+127
| | | | | | | | | | | | | | | | | | | | * Use pread/pwrite to avoid updating position in file descriptor * Emulate missing pread/pwrite on win32 using overlapped file IO
| * | | Remove broken support for write in emulated mmapDhruva Krishnamurthy2020-12-271-5/+6
| |/ / | | | | | | | | | | | | | | | | | | * Emulated mmap based write without pagefault handling is not possible since IO happens outside of call to mmap and data is written to mapped memory * Potential emulation using userfaultfd() might be possible
* | | Use an option instead of a flag for USE_BUNDLED_ZLIBlhchavez2021-01-041-13/+17
| | | | | | | | | | | | | | | Now `USE_BUNDLED_ZLIB` can be set to the string `Chromium` to enable the Chromium implementation of zlib.
* | | zlib: Add support for building with Chromium's zlib implementationlhchavez2020-12-231-4/+11
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change builds libgit2 using Chromium's zlib implementation by invoking cmake with `-DUSE_BUNDLED_ZLIB=ON -DUSE_CHROMIUM_ZLIB=ON`, which is ~10% faster than the bundled zlib for the core::zstream suite. This version of zlib has some optimizations: a) Decompression (Intel+ARM): inflate_fast, adler32, crc32, etc. b) Compression (Intel): fill_window, longest_match, hash function, etc. Due to the introduction of SIMD optimizations, and to get the maximum performance out of this fork of zlib, this requires an x86_64 processor with SSE4.2 and CLMUL (anything Westmere or later, ~2010). The Chromium zlib implementation also supports ARM with NEON, but it has not been enabled in this patch. Performance =========== TL;DR: Running just `./libgit2_clar -score::zstream` 100 times in a loop took 0:56.30 before and 0:50.67 after (~10% reduction!). The bundled and system zlib implementations on an Ubuntu Focal system perform relatively similar (the bundled one is marginally better due to the compiler being able to inline some functions), so only the bundled and Chromium zlibs were compared. For a more balanced comparison (to ensure that nothing regressed overall), `libgit2_clar` under `perf` was also run, and the zlib-related functions were compared. Bundled ------- ```shell cmake \ -DUSE_BUNDLED_ZLIB=ON \ -DUSE_CHROMIUM_ZLIB=OFF \ -DCMAKE_BUILD_TYPE="RelWithDebInfo" \ -DCMAKE_C_FLAGS="-fPIC -fno-omit-frame-pointer" \ -GNinja \ .. ninja perf record --call-graph=dwarf ./libgit2_clar perf report --children ``` ``` Samples: 87K of event 'cycles', Event count (approx.): 75923450603 Children Self Command Shared Objec Symbol + 4.14% 0.01% libgit2_clar libgit2_clar [.] git_zstream_get_output_chunk + 2.91% 0.00% libgit2_clar libgit2_clar [.] git_zstream_get_output + 0.69% 0.00% libgit2_clar libgit2_clar [.] git_zstream_get_output (inlined) 0.17% 0.00% libgit2_clar libgit2_clar [.] git_zstream_init 0.02% 0.00% libgit2_clar libgit2_clar [.] git_zstream_reset 0.00% 0.00% libgit2_clar libgit2_clar [.] git_zstream_eos 0.00% 0.00% libgit2_clar libgit2_clar [.] git_zstream_done 0.00% 0.00% libgit2_clar libgit2_clar [.] git_zstream_free (inlined) Samples: 87K of event 'cycles', Event count (approx.): 75923450603 Children Self Command Shared Objec Symbol + 3.12% 0.01% libgit2_clar libgit2_clar [.] deflate + 2.65% 1.48% libgit2_clar libgit2_clar [.] deflate_slow + 1.60% 0.55% libgit2_clar libgit2_clar [.] inflate + 0.53% 0.00% libgit2_clar libgit2_clar [.] write_deflate 0.49% 0.36% libgit2_clar libgit2_clar [.] inflate_fast 0.46% 0.02% libgit2_clar libgit2_clar [.] deflate_fast 0.19% 0.19% libgit2_clar libgit2_clar [.] inflate_table 0.16% 0.01% libgit2_clar libgit2_clar [.] inflateInit_ 0.15% 0.00% libgit2_clar libgit2_clar [.] inflateInit2_ (inlined) 0.10% 0.00% libgit2_clar libgit2_clar [.] deflateInit_ 0.10% 0.00% libgit2_clar libgit2_clar [.] deflateInit2_ 0.03% 0.00% libgit2_clar libgit2_clar [.] deflateReset (inlined) 0.02% 0.00% libgit2_clar libgit2_clar [.] deflateReset 0.02% 0.00% libgit2_clar libgit2_clar [.] inflateEnd 0.02% 0.00% libgit2_clar libgit2_clar [.] deflateEnd 0.01% 0.00% libgit2_clar libgit2_clar [.] deflateResetKeep 0.01% 0.01% libgit2_clar libgit2_clar [.] inflateReset2 0.01% 0.00% libgit2_clar libgit2_clar [.] deflateReset (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] inflateStateCheck (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] inflateReset (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] inflateStateCheck (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] deflateStateCheck (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] inflateResetKeep (inlined) ``` Chromium -------- ```shell cmake \ -DUSE_BUNDLED_ZLIB=ON \ -DUSE_CHROMIUM_ZLIB=ON \ -DCMAKE_BUILD_TYPE="RelWithDebInfo" \ -DCMAKE_C_FLAGS="-fPIC -fno-omit-frame-pointer" \ -GNinja \ .. ninja perf record --call-graph=dwarf ./libgit2_clar perf report --children ``` ``` Samples: 97K of event 'cycles', Event count (approx.): 80862210917 Children Self Command Shared Objec Symbol + 3.31% 0.00% libgit2_clar libgit2_clar [.] git_zstream_get_output_chunk + 2.27% 0.01% libgit2_clar libgit2_clar [.] git_zstream_get_output + 0.55% 0.00% libgit2_clar libgit2_clar [.] git_zstream_get_output (inlined) 0.18% 0.00% libgit2_clar libgit2_clar [.] git_zstream_init 0.02% 0.00% libgit2_clar libgit2_clar [.] git_zstream_reset 0.00% 0.00% libgit2_clar libgit2_clar [.] git_zstream_free (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] git_zstream_done 0.00% 0.00% libgit2_clar libgit2_clar [.] git_zstream_free Samples: 97K of event 'cycles', Event count (approx.): 80862210917 Children Self Command Shared Objec Symbol + 2.55% 0.01% libgit2_clar libgit2_clar [.] deflate + 2.25% 1.41% libgit2_clar libgit2_clar [.] deflate_slow + 1.10% 0.52% libgit2_clar libgit2_clar [.] inflate 0.36% 0.00% libgit2_clar libgit2_clar [.] write_deflate 0.30% 0.03% libgit2_clar libgit2_clar [.] deflate_fast 0.28% 0.15% libgit2_clar libgit2_clar [.] inflate_fast_chunk_ 0.19% 0.19% libgit2_clar libgit2_clar [.] inflate_table 0.17% 0.01% libgit2_clar libgit2_clar [.] inflateInit_ 0.16% 0.00% libgit2_clar libgit2_clar [.] inflateInit2_ (inlined) 0.15% 0.00% libgit2_clar libgit2_clar [.] deflateInit_ 0.15% 0.00% libgit2_clar libgit2_clar [.] deflateInit2_ 0.11% 0.01% libgit2_clar libgit2_clar [.] adler32_z 0.09% 0.09% libgit2_clar libgit2_clar [.] adler32_simd_ 0.05% 0.00% libgit2_clar libgit2_clar [.] deflateReset (inlined) 0.05% 0.00% libgit2_clar libgit2_clar [.] deflate_read_buf 0.03% 0.00% libgit2_clar libgit2_clar [.] inflateEnd 0.02% 0.00% libgit2_clar libgit2_clar [.] deflateReset 0.01% 0.00% libgit2_clar libgit2_clar [.] deflateEnd 0.01% 0.01% libgit2_clar libgit2_clar [.] inflateReset2 0.01% 0.00% libgit2_clar libgit2_clar [.] inflateReset (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] adler32 0.00% 0.00% libgit2_clar libgit2_clar [.] inflateResetKeep (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] deflateResetKeep 0.00% 0.00% libgit2_clar libgit2_clar [.] inflateStateCheck (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] inflateStateCheck (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] inflateStateCheck (inlined) 0.00% 0.00% libgit2_clar libgit2_clar [.] deflateStateCheck (inlined) ```
* | Merge pull request #5741 from libgit2/ethomson/ipv6Edward Thomson2020-12-234-28/+68
|\ \ | | | | | | Handle ipv6 addresses
| * | net: function to identify ipv6 addresses in URLsEdward Thomson2020-12-232-0/+8
| | |
| * | net: is_default_port is a boolEdward Thomson2020-12-232-3/+3
| | |
| * | winhttp: handle ipv6 addressesEdward Thomson2020-12-231-15/+27
| | |
| * | http: handle ipv6 addressesEdward Thomson2020-12-231-10/+30
| | |
* | | Wrap newer hostkeys in #ifdefsMiguel Arroz2020-12-211-0/+6
| | | | | | | | | | | | This allows the library to be built using a pre-1.9.0 version of libssh2.
* | | Add support for additional hostkey types.Miguel Arroz2020-12-211-0/+12
|/ / | | | | | | Specifically: ECDSA_256, ECDSA_384, ECDSA_521 and ED25519.
* | Merge pull request #5746 from libgit2/ethomson/configmapcacheEdward Thomson2020-12-202-6/+9
|\ \ | | | | | | repository: use intptr_t's in the config map cache
| * | config_cache: cleanup config map lookupEdward Thomson2020-12-201-5/+8
| | |
| * | repository: use intptr_t's in the config map cacheethomson/configmapcacheEdward Thomson2020-12-201-1/+1
| | | | | | | | | | | | | | | | | | Since we're using atomic primitives to read and write into the config map cache, we need to read/write something pointer-sized. Use an `intptr_t` for the config map cache.
* | | Add tests for `git__multiply_int64_overflow`lhchavez2020-12-191-5/+37
| | | | | | | | | | | | | | | | | | | | | | | | | | | As it turns out, the implementation of `git__multiply_int64_overflow` is full of edge cases and tricky arithmetic. That means that it should have unit tests. As a result, a bug in `git__strntol64` was found (and fixed!) in clang+32-bit.
* | | Third attempt to fix the 32-bit version of `git__multiply_int64_overflow`lhchavez2020-12-181-4/+11
| | | | | | | | | | | | | | | | | | This change should now fix the issue for realsies. `./libgit2_clar -score::strtol` passes on a 32-bit Docker.
* | | Avoid using `__builtin_mul_overflow` with the clang+32-bit combolhchavez2020-12-181-3/+10
|/ / | | | | | | | | | | | | | | This causes clang to produce an undefined reference to `__mulodi4`. This could be fixed by statically linking some compiler-rt libraries to provide this symbol, but let's first stop the bleeding since doing the correct long-term fix requires some non-trivial CMake knowledge which I lack.
* | Merge pull request #5740 from libgit2/ethomson/zlibEdward Thomson2020-12-161-4/+9
|\ \ | | | | | | pack: continue zlib while we can make progress
| * | pack: continue zlib while we can make progressethomson/zlibEdward Thomson2020-12-151-4/+9
| |/ | | | | | | | | Continue the zlib stream as long as we can make progress; stop when we stop getting output _or_ when zlib stops taking input from us.
* | Merge pull request #5727 from lhchavez/make-git-diff-fastEdward Thomson2020-12-134-33/+76
|\ \ | | | | | | Cache the parsed submodule config when diffing
| * | Fix an oopslhchavez2020-12-111-1/+1
| | |
| * | Small refactor to make thing tidierlhchavez2020-12-114-43/+46
| | | | | | | | | | | | Also repurposed an unused function and deleted another one.
| * | Cache the parsed submodule config when diffinglhchavez2020-12-103-8/+48
| |/ | | | | | | | | | | | | | | | | | | This change makes that anything that calls `git_diff__from_iterators` (any of the `git_diff_xxx` functions) only need to parse the `.gitmodules` file once. This can be avoided by calling `git_repository_submodule_cache_all(...)`, but we can do that safely for the user with no change in semantics. Fixes: #5725
* | Merge pull request #5735 from lhchavez/faster-strntol64Edward Thomson2020-12-132-11/+34
|\ \ | | | | | | Make git__strntol64() ~70%* faster
| * | Make git__strntol64() ~70%* fasterlhchavez2020-12-122-11/+34
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change uses compiler intrinsics to detect overflows instead of using divisions to detect potential overflow. This makes the code faster and makes it easier to read as a bonus side-effect! Some of the things this quickens: * Config parsing. * Tree parsing. * Smart protocol negotiation. \* Measured by running `libgit2_clar` with `-fno-optimize-sibling-calls -fno-omit-frame-pointer` under `perf(1)`: ```shell $ perf diff --symbols=git__strntol64 --compute=ratio \ --percentage=absolute baseline.data perf.data \# Event 'cycles' \# \# Baseline Ratio Shared Object \# ........ .............. ............. \# 0.25% 0.321836 libgit2_clar ```