blob: 1a03a38b036dbe8905ca9762e0def58ebdd957ca [file] [log] [blame]
How Diffs are Generated in Subversion Client Libraries
======================================================
This is an overview of how the Subversion client libraries calculate a
difference between two trees. The two trees might be the working copy
and its base state, or two trees in the repository, or one tree in the
repository and one in the working copy.
DATA FLOWS
"delta edit" => svn_delta_editor_t
"diff cb." => svn_wc_diff_callbacks4_t
"ra report" => svn_ra_reporter3_t
"summary cb." => svn_client_diff_summarize_func_t
Merge (a repos-repos diff)
+-------------+ +---------------+ +----------+
| Diff two | | Convert delta | | Merge |
| repo trees | | edit to diff | | into WC |
| | | callbacks | | |
| | --------> | | --------> | |
| | delta | | diff | |
| | edit | | cb. | |
+-------------+ +---------------+ +----------+
ra_do_diff3() client_get_diff_ed.() merge_callbacks
<virtual> cl/repos_diff.c cl/merge.c
Diff [--git] (repos-repos)
+-------------+ +---------------+ +----------+
| Diff two | | Convert delta | | Print a |
| repo trees | | edit to diff | | plain or |
| | | callbacks | [1] | git diff |
| | --------> | | --------> | |
| | delta | | diff | |
| | edit | | cb. | |
+-------------+ +---------------+ +----------+
ra_do_diff3() client_get_diff_ed.() diff_callbacks
<virtual> cl/repos_diff.c cl/diff.c
[1] See "diff --summarize" below for an alternative ending.
Diff [--git] (wc-wc)
+-------------+ +----------+
| Diff two | | Print a |
| WC trees | | plain or |
| | [1] | git diff |
| | ------------------------------------> | |
| | diff | |
| | cb. | |
+-------------+ +----------+
wc_diff6() diff_callbacks
wc/diff_local.c cl/diff.c
[1] See "diff --summarize" below for an alternative ending.
Diff [--git] (repos-wc)
+----------+ +----------+ +----------+ +----------+
| Crawl WC | | Diff repo| | WC diff | | Print a |
| and | | against | | editor | | plain or |
| report | | reported | | | [2] | git diff |
| | ---> | | ---> | | ---> | |
| | ra | | delta| | diff | |
| | rept.| | edit | | cb. | |
+----------+ +----------+ +----------+ +----------+
wc_crawl_rev's5() ra_do_diff3() wc_get_diff_ed.6() diff_callbacks
wc/diff_local.c <virtual> wc/diff_editor.c cl/diff.c
[2] If diff --summarize were supported, this is where it would plug in.
Diff --summarize (repos-repos or wc-wc)
- - - ----+ +-----------+ +----------+
(Either of | | Summarize | | Print a |
the flows | | the diff | | summary |
marked [1] | [1] | | | |
above.) | --------> | | --------> | |
| diff | | summary | |
| cb. | | cb. | |
- - - ----+ +-----------+ +----------+
cb_*() summarize_regular()
cl/repos_diff_summ..c svn/diff-cmd.c
Diff --summarize --xml (repos-repos or wc-wc)
- - - ----+ +-----------+ +----------+
(Either of | | Summarize | | Print an |
the flows | | the diff | | XML |
marked [1] | [1] | | | summary |
above.) | --------> | | --------> | |
| diff | | summary | |
| cb. | | cb. | |
- - - ----+ +-----------+ +----------+
cb_*() summarize_xml()
cl/repos_diff_summ..c svn/diff-cmd.c