The diff command source file. More...
#include <stdlib.h>#include <unistd.h>#include <poll.h>#include <alloca.h>#include <time.h>#include <fcntl.h>#include "global.h"#include "revert.h"#include "helper.h"#include "interface.h"#include "url.h"#include "status.h"#include "options.h"#include "est_ops.h"#include "ignore.h"#include "waa.h"#include "racallback.h"#include "cp_mv.h"#include "warnings.h"#include "diff.h"
Go to the source code of this file.
Defines | |
| #define | META_DIFF_DELIMITER (0xf44fee31) |
| A number that cannot be a valid pointer. | |
| #define | META_DIFF_MAXLEN (256) |
| How long may a meta-data diff string be? | |
Functions | |
| int | df___print_meta (char *format,...) |
| Diff the given meta-data. | |
| int | df__do_diff (struct estat *sts, svn_revnum_t rev1, svn_revnum_t rev2, char *rev2_file) |
| Get a file from the repository, and initiate a diff. | |
| int | df___cleanup (void) |
| Cleanup rests. | |
| static void | df___signal (int sig) |
| FSVS GCOV MARK: df___signal should not be executed. | |
| int | df___type_def_diff (struct estat *sts, svn_revnum_t rev, apr_pool_t *pool) |
| Does a diff of the local non-directory against the given revision. | |
| int | df___direct_diff (struct estat *sts) |
| -. | |
| int | df___cheap_colordiff (void) |
| A cheap replacement for colordiff. | |
| int | df___colordiff (int *handle, pid_t *cd_pid) |
| Tries to start colordiff. | |
| int | df___diff_wc_remote (struct estat *entry, apr_pool_t *pool) |
| Prints diffs for all entries with estat::entry_status or estat::remote_status set. | |
| int | df___reset_remote_st (struct estat *sts) |
| Set the entry as BASE (has no changes). | |
| int | df___repos_repos (struct estat *sts) |
| Does a repos/repos diff. | |
| int | df__work (struct estat *root, int argc, char *argv[]) |
| -. | |
Variables | |
| int | cdiff_pipe = STDOUT_FILENO |
| pid_t | cdiff_pid = 0 |
The diff command source file.
Currently only diffing single files is possible; recursive diffing of trees has to be done.
For trees it might be better to fetch all files in a kind of update-scenario; then we'd avoid the many round-trips we'd have with single-file-fetching. Although an optimized file-fetching (rsync-like block transfers) would probably save a lot of bandwidth.
Definition in file diff.c.
| #define META_DIFF_DELIMITER (0xf44fee31) |
A number that cannot be a valid pointer.
Definition at line 92 of file diff.c.
Referenced by df___print_meta(), and df__do_diff().
| #define META_DIFF_MAXLEN (256) |
How long may a meta-data diff string be?
Definition at line 94 of file diff.c.
Referenced by df___print_meta().
| int df___cheap_colordiff | ( | void | ) |
A cheap replacement for colordiff.
Nothing more than a cat.
Definition at line 582 of file diff.c.
References STOPIF_CODE_ERR.
Referenced by df___colordiff().

| int df___cleanup | ( | void | ) |
Cleanup rests.
Definition at line 411 of file diff.c.
References cdiff_pid, cdiff_pipe, DEBUGP, df__do_diff(), STOPIF, and STOPIF_CODE_ERR.
Referenced by df___signal(), and df__work().


| int df___colordiff | ( | int * | handle, | |
| pid_t * | cd_pid | |||
| ) |
Tries to start colordiff.
If colordiff can not be started, but the option says auto, we just forward the data. Sadly neither splice nor sendfile are available everywhere.
Definition at line 611 of file diff.c.
References DEBUGP, df___cheap_colordiff(), OPT__COLORDIFF, STOPIF_CODE_ERR, and STOPIF_CODE_ERR_GOTO.
Referenced by df__work().


| int df___diff_wc_remote | ( | struct estat * | entry, | |
| apr_pool_t * | pool | |||
| ) |
Prints diffs for all entries with estat::entry_status or estat::remote_status set.
Definition at line 719 of file diff.c.
References estat::by_inode, DEBUGP_dump_estat(), df___type_def_diff(), estat::entry_count, estat::entry_status, FS_NEW, FS_REMOVED, FS_REPLACED, estat::local_mode_packed, sstat_t::mode, estat::new_rev_mode_packed, ops__build_path(), PACKED_to_MODE_T, estat::remote_status, estat::repos_rev, estat::st, st__type_string(), STOPIF, and STOPIF_CODE_EPIPE.
Referenced by df__work().


| int df___direct_diff | ( | struct estat * | sts | ) |
-.
Definition at line 515 of file diff.c.
References DEBUGP, df___type_def_diff(), estat::entry_status, estat::flags, FS_NEW, FS_REMOVED, global_pool, sstat_t::mode, ops__build_path(), opt__is_verbose(), opt_target_revisions_given, estat::repos_rev, RF___IS_COPY, estat::st, STOPIF, STOPIF_CODE_EPIPE, estat::to_be_ignored, and estat::url.
Referenced by df__work().


| int df___print_meta | ( | char * | format, | |
| ... | ||||
| ) |
Diff the given meta-data.
The given format string is used with the va-args to generate two strings. If they are equal, one is printed (with space at front); else both are shown (with '-' and '+'). The delimiter between the two argument lists is via META_DIFF_DELIMITER. (NULL could be in the data, eg. as integer 0.)
It would be faster to simply compare the values given to vsnprintf(); that could even be done here, by using two va_list variables and comparing. But it's not a performance problem.
Definition at line 108 of file diff.c.
References BUG_ON, DEBUGP, META_DIFF_DELIMITER, META_DIFF_MAXLEN, STOPIF_CODE_EPIPE, and STOPIF_CODE_ERR.
Referenced by df__do_diff().

| int df___repos_repos | ( | struct estat * | sts | ) |
Does a repos/repos diff.
Currently works only for files.
Definition at line 817 of file diff.c.
References BUG, estat::by_inode, DEBUGP, df__do_diff(), estat::entry_count, FS_NEW, FS_REMOVED, FS_REPLACED, hlp__format_path(), sstat_t::mode, ops__build_path(), opt_target_revision, opt_target_revision2, estat::remote_status, S_IFANYSPECIAL, estat::st, st__status_string_fromint(), STOPIF, and STOPIF_CODE_EPIPE.
Referenced by df__work().


| int df___reset_remote_st | ( | struct estat * | sts | ) |
Set the entry as BASE (has no changes).
Definition at line 808 of file diff.c.
References estat::remote_status.
Referenced by df__work().

| static void df___signal | ( | int | sig | ) | [static] |
FSVS GCOV MARK: df___signal should not be executed.
Signal handler function. If the user wants us to quit, we remove the temporary files, and exit.
Is there a better/cleaner way?
Definition at line 448 of file diff.c.
References DEBUGP, and df___cleanup().
Referenced by df__work().


| int df___type_def_diff | ( | struct estat * | sts, | |
| svn_revnum_t | rev, | |||
| apr_pool_t * | pool | |||
| ) |
Does a diff of the local non-directory against the given revision.
Definition at line 458 of file diff.c.
References BUG, df__do_diff(), sstat_t::mode, ops__build_path(), ops__dev_to_filedata(), ops__link_to_string(), S_IFANYSPECIAL, estat::st, STOPIF, STOPIF_CODE_EPIPE, STOPIF_CODE_ERR, and waa__get_tmp_name().
Referenced by df___diff_wc_remote(), and df___direct_diff().


| int df__do_diff | ( | struct estat * | sts, | |
| svn_revnum_t | rev1, | |||
| svn_revnum_t | rev2, | |||
| char * | rev2_file | |||
| ) |
Get a file from the repository, and initiate a diff.
Normally rev1 == root->repos_rev; to diff against the base revision of the file.
If the user specified only a single revision (rev2 == 0), the local file is diffed against this; else against the other repository version.
rev2_file is meaningful only if rev2 is 0; this file gets removed after printing the difference!
Definition at line 162 of file diff.c.
References cdiff_pipe, cm__get_source(), current_url, DEBUGP, DECODER_UNKNOWN, df___print_meta(), estat::flags, FSVS_EXP_CURR_ENTRY, sstat_t::gid, hlp__format_path(), hlp__get_grname(), hlp__get_uname(), hlp__strdup(), META_DIFF_DELIMITER, sstat_t::mode, sstat_t::mtim, ops__build_path(), OPT__DIFF_EXTRA, OPT__DIFF_OPT, OPT__DIFF_PRG, opt__is_verbose(), url_t::pool, rev__get_text_to_tmpfile(), RF___IS_COPY, estat::st, STOPIF, STOPIF_CODE_EPIPE, STOPIF_CODE_ERR, sstat_t::uid, estat::url, url__canonical_rev(), url__find(), url__full_url(), url__open_session(), wa__warn(), and WRN__DIFF_EXIT_STATUS.
Referenced by df___cleanup(), df___repos_repos(), df___type_def_diff(), and df__work().


| int df__work | ( | struct estat * | root, | |
| int | argc, | |||
| char * | argv[] | |||
| ) |
-.
We get the WC status, fetch the named changed entries, and call an external diff program for each.
As a small performance optimization we do that kind of parallel - while we're fetching a file, we run the diff.
Definition at line 887 of file diff.c.
References action, BUG, cb__record_changes(), cb__record_changes_mixed(), cdiff_pid, cdiff_pipe, url_t::current_rev, current_url, DEBUGP, df___cleanup(), df___colordiff(), df___diff_wc_remote(), df___direct_diff(), df___repos_repos(), df___reset_remote_st(), df___signal(), df__do_diff(), ign__load_list(), actionlist_t::local_callback, actionlist_t::local_uninit, OPT__COLORDIFF, opt__doesnt_say_off(), opt_target_revision, opt_target_revision2, opt_target_revisions_given, url_t::pool, PRIO_PRE_CMDLINE, actionlist_t::repos_feedback, st__progress, st__progress_uninit, STOPIF, STOPIF_CODE_ERR, url__canonical_rev(), url__iterator(), url__load_nonempty_list(), url__mark_todo(), waa__find_common_base(), and waa__read_or_build_tree().

| pid_t cdiff_pid = 0 |
Definition at line 88 of file diff.c.
Referenced by df___cleanup(), and df__work().
| int cdiff_pipe = STDOUT_FILENO |
Definition at line 87 of file diff.c.
Referenced by df___cleanup(), df__do_diff(), and df__work().
1.6.1