| 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 |
| |