[PATCH 00/83] libify apply and use lib in am
- From
Christian Couder <christian.couder@gmail.com>
- Date
- Apr 24, 2016, 13:33 UTC
- Message-ID
- <1461504863-15946-1-git-send-email-chriscool@tuxfamily.org>
This is a patch series about libifying `git apply` functionality, and using this libified functionality in `git am`, so that no 'git apply' process is spawn anymore. This makes `git am` significantly faster, so `git rebase`, when it uses the am backend, is also significantly faster.
This has initially been discussed in the following thread:
http://thread.gmane.org/gmane.comp.version-control.git/287236/
A RFC patch series was sent previously that only got rid of the global variables and refactored the code around a bit:
http://thread.gmane.org/gmane.comp.version-control.git/288489/
This new patch series is built on top of that previous work, so patches 1/83 to 47/83 are from the previous RFC patch series and patches after that are new.
Sorry if this patch series is a bit long. I can split it into two or more series if it is prefered.
The benefits are not just related to not creating new processes. When `git am` launched a `git apply` process, this new process had to read the index from disk. Then after the `git apply`process had terminated, `git am` dropped its index and read the index from disk to get the index that had been modified by the `git apply`process. This was inefficient and also prevented the split-index mechanism to provide many performance benefits.
Performance numbers:
- A few days ago Ævar did a huge many-hundred commit rebase on the
kernel with untracked cache.command: git rebase --onto 1993b17 52bef0c 29dde7c
Vanilla "next" without split index: 1m54.953s Vanilla "next" with split index: 1m22.476s This series on top of "next" without split index: 1m12.034s This series on top of "next" with split index: 0m15.678s
Ævar used his Debian laptop with SSD.
- Some days ago I tested rebasing 13 commits in Booking.com's
monorepo on a Red Hat 6.5 server with split-index and
GIT_TRACE_PERFORMANCE=1.With Git v2.8.0, the rebase took 6.375888383 s, with the git am command launched by the rebase command taking 3.705677431 s.
With this series on top of next, the rebase took 3.044529494 s, with the git am command launched by the rebase command taking 0.583521168 s.
No tests on Windows have been performed, but it could be interesting to test on this platform.
Christian Couder (83):
builtin/apply: make gitdiff_verify_name() return void
builtin/apply: avoid parameter shadowing 'p_value' global
builtin/apply: avoid parameter shadowing 'linenr' global
builtin/apply: avoid local variable shadowing 'len' parameter
builtin/apply: extract line_by_line_fuzzy_match() from
match_fragment()
builtin/apply: move 'options' variable into cmd_apply()
builtin/apply: introduce 'struct apply_state' to start libifying
builtin/apply: move 'unidiff_zero' global into 'struct apply_state'
builtin/apply: move 'check' global into 'struct apply_state'
builtin/apply: move 'check_index' global into 'struct apply_state'
builtin/apply: move 'apply_in_reverse' global into 'struct
apply_state'
builtin/apply: move 'apply_with_reject' global into 'struct
apply_state'
builtin/apply: move 'apply_verbosely' global into 'struct apply_state'
builtin/apply: move 'update_index' global into 'struct apply_state'
builtin/apply: move 'allow_overlap' global into 'struct apply_state'
builtin/apply: move 'cached' global into 'struct apply_state'
builtin/apply: move 'diffstat' global into 'struct apply_state'
builtin/apply: move 'numstat' global into 'struct apply_state'
builtin/apply: move 'summary' global into 'struct apply_state'
builtin/apply: move 'threeway' global into 'struct apply_state'
builtin/apply: move 'no-add' global into 'struct apply_state'
builtin/apply: move 'unsafe_paths' global into 'struct apply_state'
builtin/apply: move 'line_termination' global into 'struct
apply_state'
builtin/apply: move 'fake_ancestor' global into 'struct apply_state'
builtin/apply: move 'p_context' global into 'struct apply_state'
builtin/apply: move 'apply' global into 'struct apply_state'
builtin/apply: move 'read_stdin' global into cmd_apply()
builtin/apply: move 'patch_input_file' global into 'struct
apply_state'
builtin/apply: move 'limit_by_name' global into 'struct apply_state'
builtin/apply: move 'has_include' global into 'struct apply_state'
builtin/apply: move 'p_value' global into 'struct apply_state'
builtin/apply: move 'p_value_known' global into 'struct apply_state'
builtin/apply: move 'root' global into 'struct apply_state'
builtin/apply: move 'whitespace_error' global into 'struct
apply_state'
builtin/apply: move 'whitespace_option' into 'struct apply_state'
builtin/apply: remove whitespace_option arg from
set_default_whitespace_mode()
builtin/apply: move 'squelch_whitespace_errors' into 'struct
apply_state'
builtin/apply: move 'applied_after_fixing_ws' into 'struct
apply_state'
builtin/apply: move 'ws_error_action' into 'struct apply_state'
builtin/apply: move 'ws_ignore_action' into 'struct apply_state'
builtin/apply: move 'max_change' and 'max_len' into 'struct
apply_state'
builtin/apply: move 'linenr' global into 'struct apply_state'
builtin/apply: move 'fn_table' global into 'struct apply_state'
builtin/apply: move 'symlink_changes' global into 'struct apply_state'
builtin/apply: move 'state' init into init_apply_state()
builtin/apply: move 'state' check into check_apply_state()
builtin/apply: move applying patches into apply_all_patches()
builtin/apply: rename 'prefix_' parameter to 'prefix'
builtin/apply: move 'lock_file' global into 'struct apply_state'
builtin/apply: get rid of the 'newfd' global
builtin/apply: make apply_patch() return -1 instead of die()ing
builtin/apply: read_patch_file() return -1 instead of die()ing
builtin/apply: make find_header() return -1 instead of die()ing
builtin/apply: make parse_chunk() return a negative integer on error
builtin/apply: make parse_single_patch() return -1 on error
apply: move 'struct apply_state' to apply.h
builtin/apply: libify parse_whitespace_option()
builtin/apply: libify parse_ignorewhitespace_option()
builtin/apply: move init_apply_state() to apply.c
apply: libify init_apply_state()
builtin/apply: libify check_apply_state()
builtin/apply: move check_apply_state() to apply.c
builtin/apply: make apply_all_patches() return -1 on error
builtin/apply: make parse_traditional_patch() return -1 on error
builtin/apply: make gitdiff_verify_name() return -1 on error
builtin/apply: change die_on_unsafe_path() to check_unsafe_path()
builtin/apply: make build_fake_ancestor() return -1 on error
builtin/apply: make remove_file() return -1 on error
builtin/apply: make add_conflicted_stages_file() return -1 on error
builtin/apply: make add_index_file() return -1 on error
builtin/apply: make create_file() return -1 on error
builtin/apply: make write_out_one_result() return -1 on error
builtin/apply: make write_out_results() return -1 on error
builtin/apply: make try_create_file() return -1 on error
builtin/apply: make create_one_file() return -1 on error
builtin/apply: rename option parsing functions
apply: rename and move opt constants to apply.h
Move libified code from builtin/apply.c to apply.{c,h}
apply: make some parsing functions static again
run-command: make dup_devnull() non static
apply: roll back index in case of error
environment: add set_index_file()
builtin/am: use apply api in run_apply()Makefile | 1 + apply.c | 4796 ++++++++++++++++++++++++++++++++++++++++++++++++ apply.h | 149 ++ builtin/am.c | 103 +- builtin/apply.c | 4665 +--------------------------------------------- cache.h | 1 + environment.c | 5 + run-command.c | 2 +- run-command.h | 6 + t/t4012-diff-binary.sh | 4 +- t/t4254-am-corrupt.sh | 2 +- 11 files changed, 5096 insertions(+), 4638 deletions(-) create mode 100644 apply.c create mode 100644 apply.h
-- 2.8.1.300.g5fed0c0