Class: Bringit::Diff
- Inherits:
-
Object
- Object
- Bringit::Diff
- Includes:
- EncodingHelper
- Defined in:
- lib/bringit/diff.rb
Constant Summary collapse
- TimeoutError =
Class.new(StandardError)
- DIFF_SIZE_LIMIT =
The maximum size of a diff to display.
102400
- DIFF_COLLAPSE_LIMIT =
The maximum size before a diff is collapsed.
10240
Constants included from EncodingHelper
EncodingHelper::ENCODING_CONFIDENCE_THRESHOLD
Instance Attribute Summary collapse
-
#a_mode ⇒ Object
Diff properties.
-
#b_mode ⇒ Object
Diff properties.
-
#deleted_file ⇒ Object
Stats properties.
-
#diff ⇒ Object
Diff properties.
-
#new_file ⇒ Object
Stats properties.
-
#new_path ⇒ Object
Diff properties.
-
#old_path ⇒ Object
Diff properties.
-
#renamed_file ⇒ Object
Stats properties.
-
#too_large ⇒ Object
Returns the value of attribute too_large.
Class Method Summary collapse
- .between(repo, head, base, options = {}, *paths) ⇒ Object
-
.filter_diff_options(options, default_options = {}) ⇒ Object
Return a copy of the
options
hash containing only keys that can be passed to Rugged.
Instance Method Summary collapse
- #collapsed? ⇒ Boolean
- #collapsible? ⇒ Boolean
-
#initialize(raw_diff, collapse: false) ⇒ Diff
constructor
A new instance of Diff.
- #line_count ⇒ Object
- #prune_collapsed_diff! ⇒ Object
- #prune_large_diff! ⇒ Object
- #serialize_keys ⇒ Object
- #submodule? ⇒ Boolean
- #to_hash ⇒ Object
- #too_large? ⇒ Boolean
Methods included from EncodingHelper
Constructor Details
#initialize(raw_diff, collapse: false) ⇒ Diff
Returns a new instance of Diff.
175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/bringit/diff.rb', line 175 def initialize(raw_diff, collapse: false) case raw_diff when Hash init_from_hash(raw_diff, collapse: collapse) when Rugged::Patch, Rugged::Diff::Delta init_from_rugged(raw_diff, collapse: collapse) when nil raise "Nil as raw diff passed" else raise "Invalid raw diff type: #{raw_diff.class}" end end |
Instance Attribute Details
#a_mode ⇒ Object
Diff properties
8 9 10 |
# File 'lib/bringit/diff.rb', line 8 def a_mode @a_mode end |
#b_mode ⇒ Object
Diff properties
8 9 10 |
# File 'lib/bringit/diff.rb', line 8 def b_mode @b_mode end |
#deleted_file ⇒ Object
Stats properties
11 12 13 |
# File 'lib/bringit/diff.rb', line 11 def deleted_file @deleted_file end |
#diff ⇒ Object
Diff properties
8 9 10 |
# File 'lib/bringit/diff.rb', line 8 def diff @diff end |
#new_file ⇒ Object
Stats properties
11 12 13 |
# File 'lib/bringit/diff.rb', line 11 def new_file @new_file end |
#new_path ⇒ Object
Diff properties
8 9 10 |
# File 'lib/bringit/diff.rb', line 8 def new_path @new_path end |
#old_path ⇒ Object
Diff properties
8 9 10 |
# File 'lib/bringit/diff.rb', line 8 def old_path @old_path end |
#renamed_file ⇒ Object
Stats properties
11 12 13 |
# File 'lib/bringit/diff.rb', line 11 def renamed_file @renamed_file end |
#too_large ⇒ Object
Returns the value of attribute too_large.
13 14 15 |
# File 'lib/bringit/diff.rb', line 13 def too_large @too_large end |
Class Method Details
.between(repo, head, base, options = {}, *paths) ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/bringit/diff.rb', line 22 def between(repo, head, base, = {}, *paths) straight = .delete(:straight) || false common_commit = if straight base else # Only show what is new in the source branch # compared to the target branch, not the other way # around. The linex below with merge_base is # equivalent to diff with three dots (git diff # branch1...branch2) From the git documentation: # "git diff A...B" is equivalent to "git diff # $(git-merge-base A B) B" repo.merge_base_commit(head, base) end ||= {} = () repo.diff(common_commit, head, , *paths) end |
.filter_diff_options(options, default_options = {}) ⇒ Object
Return a copy of the options
hash containing only keys that can be passed to Rugged. Allowed options are:
:max_size ::
An integer specifying the maximum byte size of a file before a it
will be treated as binary. The default value is 512MB.
:context_lines ::
The number of unchanged lines that define the boundary of a hunk
(and to display before and after the actual changes). The default is
3.
:interhunk_lines ::
The maximum number of unchanged lines between hunk boundaries before
the hunks will be merged into a one. The default is 0.
:old_prefix ::
The virtual "directory" to prefix to old filenames in hunk headers.
The default is "a".
:new_prefix ::
The virtual "directory" to prefix to new filenames in hunk headers.
The default is "b".
:reverse ::
If true, the sides of the diff will be reversed.
:force_text ::
If true, all files will be treated as text, disabling binary
attributes & detection.
:ignore_whitespace ::
If true, all whitespace will be ignored.
:ignore_whitespace_change ::
If true, changes in amount of whitespace will be ignored.
:ignore_whitespace_eol ::
If true, whitespace at end of line will be ignored.
:ignore_submodules ::
if true, submodules will be excluded from the diff completely.
:patience ::
If true, the "patience diff" algorithm will be used (currenlty
unimplemented).
:include_ignored ::
If true, ignored files will be included in the diff.
:include_untracked ::
If true, untracked files will be included in the diff.
:include_unmodified ::
If true, unmodified files will be included in the diff.
:recurse_untracked_dirs ::
Even if +:include_untracked+ is true, untracked directories will
only be marked with a single entry in the diff. If this flag is set
to true, all files under ignored directories will be included in the
diff, too.
:disable_pathspec_match ::
If true, the given +*paths+ will be applied as exact matches,
instead of as fnmatch patterns.
:deltas_are_icase ::
If true, filename comparisons will be made with case-insensitivity.
:include_untracked_content ::
if true, untracked content will be contained in the the diff patch
text.
:skip_binary_check ::
If true, diff deltas will be generated without spending time on
binary detection. This is useful to improve performance in cases
where the actual file content difference is not needed.
:include_typechange ::
If true, type changes for files will not be interpreted as deletion
of the "old file" and addition of the "new file", but will generate
typechange records.
:include_typechange_trees ::
Even if +:include_typechange+ is true, blob -> tree changes will
still usually be handled as a deletion of the blob. If this flag is
set to true, blob -> tree changes will be marked as typechanges.
:ignore_filemode ::
If true, file mode changes will be ignored.
:recurse_ignored_dirs ::
Even if +:include_ignored+ is true, ignored directories will only be
marked with a single entry in the diff. If this flag is set to true,
all files under ignored directories will be included in the diff,
too.
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/bringit/diff.rb', line 139 def (, = {}) = [:max_size, :context_lines, :interhunk_lines, :old_prefix, :new_prefix, :reverse, :force_text, :ignore_whitespace, :ignore_whitespace_change, :ignore_whitespace_eol, :ignore_submodules, :patience, :include_ignored, :include_untracked, :include_unmodified, :recurse_untracked_dirs, :disable_pathspec_match, :deltas_are_icase, :include_untracked_content, :skip_binary_check, :include_typechange, :include_typechange_trees, :ignore_filemode, :recurse_ignored_dirs, :paths, :max_files, :max_lines, :all_diffs, :no_collapse] if actual_defaults = .dup actual_defaults.keep_if do |key| .include?(key) end else actual_defaults = {} end if filtered_opts = .dup filtered_opts.keep_if do |key| .include?(key) end filtered_opts = actual_defaults.merge(filtered_opts) else filtered_opts = actual_defaults end filtered_opts end |
Instance Method Details
#collapsed? ⇒ Boolean
230 231 232 233 |
# File 'lib/bringit/diff.rb', line 230 def collapsed? return @collapsed if defined?(@collapsed) false end |
#collapsible? ⇒ Boolean
220 221 222 |
# File 'lib/bringit/diff.rb', line 220 def collapsible? @diff.bytesize >= DIFF_COLLAPSE_LIMIT end |
#line_count ⇒ Object
208 209 210 |
# File 'lib/bringit/diff.rb', line 208 def line_count @line_count ||= Util.count_lines(@diff) end |
#prune_collapsed_diff! ⇒ Object
235 236 237 238 239 |
# File 'lib/bringit/diff.rb', line 235 def prune_collapsed_diff! @diff = '' @line_count = 0 @collapsed = true end |
#prune_large_diff! ⇒ Object
224 225 226 227 228 |
# File 'lib/bringit/diff.rb', line 224 def prune_large_diff! @diff = '' @line_count = 0 @too_large = true end |
#serialize_keys ⇒ Object
188 189 190 |
# File 'lib/bringit/diff.rb', line 188 def serialize_keys @serialize_keys ||= %i(diff new_path old_path a_mode b_mode new_file renamed_file deleted_file too_large) end |
#submodule? ⇒ Boolean
204 205 206 |
# File 'lib/bringit/diff.rb', line 204 def submodule? a_mode == '160000' || b_mode == '160000' end |
#to_hash ⇒ Object
192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/bringit/diff.rb', line 192 def to_hash hash = {} keys = serialize_keys keys.each do |key| hash[key] = send(key) end hash end |
#too_large? ⇒ Boolean
212 213 214 215 216 217 218 |
# File 'lib/bringit/diff.rb', line 212 def too_large? if @too_large.nil? @too_large = @diff.bytesize >= DIFF_SIZE_LIMIT else @too_large end end |