Class: LegacyDiffNote

Inherits:
Note show all
Includes:
NoteOnDiff
Defined in:
app/models/legacy_diff_note.rb

Overview

A note on merge request or commit diffs, using the legacy implementation.

All new diff notes are of the type `DiffNote`, but any diff notes created before the introduction of the new implementation still use `LegacyDiffNote`.

A note of this type is never resolvable.

Constant Summary

Constants inherited from Note

Note::NON_DIFF_NOTE_TYPES, Note::TYPES_RESTRICTED_BY_GROUP_ABILITY, Note::TYPES_RESTRICTED_BY_PROJECT_ABILITY

Constants included from ThrottledTouch

ThrottledTouch::TOUCH_INTERVAL

Constants included from Gitlab::SQL::Pattern

Gitlab::SQL::Pattern::MIN_CHARS_FOR_PARTIAL_MATCHING, Gitlab::SQL::Pattern::REGEX_QUOTED_WORD

Constants included from ResolvableNote

ResolvableNote::RESOLVABLE_TYPES

Constants included from CacheMarkdownField

CacheMarkdownField::INVALIDATED_BY

Constants included from Redactable

Redactable::UNSUBSCRIBE_PATTERN

Constants inherited from ApplicationRecord

ApplicationRecord::MAX_PLUCK

Instance Attribute Summary

Attributes inherited from Note

#commands_changes, #redacted_note_html, #skip_keep_around_commits, #total_reference_count, #user_visible_reference_count

Attributes included from Importable

#imported, #importing

Instance Method Summary collapse

Methods included from NoteOnDiff

#created_at_diff?, #diff_attributes, #diff_note?

Methods inherited from Note

#award_emoji?, #banzai_render_context, #bump_updated_at, #can_be_award_emoji?, #can_be_discussion_note?, #can_create_todo?, cherry_picked_merge_requests, #commit, #confidential?, #contains_emoji_only?, #contributor?, count_for_collection, #diff_note?, #discussion, #discussion_id, discussions, #editable?, #edited?, #emoji_awardable?, #expire_etag_cache, find_discussion, #for_alert_mangement_alert?, #for_commit?, #for_design?, #for_issuable?, #for_issue?, #for_merge_request?, #for_personal_snippet?, #for_project_noteable?, #for_project_snippet?, #for_snippet?, #for_vulnerability?, grouped_diff_discussions, #hook_attrs, #in_reply_to?, #last_edited_at, #max_attachment_size, #merge_requests, model_name, #noteable, #noteable_ability_name, #noteable_assignee_or_author?, #noteable_author?, #noteable_type=, #notify_after_create, #notify_after_destroy, #parent_user, #part_of_discussion?, positions, #post_processed_cache_key, #project_name, #references, #resource_parent, #retrieve_upload, search, #show_outdated_changes?, simple_sorts, #skip_notification?, #skip_project_check?, #start_of_discussion?, #supports_suggestion?, #system_note_visible_for?, #system_note_with_references?, #to_discussion, #touch, #touch_noteable, #user_mention_class, #user_mention_identifier, #user_mentions

Methods included from Gitlab::Utils::Override

#extended, extensions, #included, #method_added, #override, #prepended, #queue_verification, verify!

Methods included from ThrottledTouch

#touch

Methods included from Editable

#edited?, #last_edited_by

Methods included from ResolvableNote

#potentially_resolvable?, #resolvable?, #resolve!, #resolve_without_save, #resolved?, #to_be_resolved?, #unresolve!, #unresolve_without_save

Methods included from AfterCommitQueue

#run_after_commit, #run_after_commit_or_now

Methods included from CacheMarkdownField

#attribute_invalidated?, #banzai_render_context, #cached_html_for, #cached_html_up_to_date?, #can_cache_field?, #invalidated_markdown_cache?, #latest_cached_markdown_version, #local_version, #mentionable_attributes_changed?, #parent_user, #refresh_markdown_cache, #refresh_markdown_cache!, #rendered_field_content, #skip_project_check?, #store_mentions!, #updated_cached_html_for

Methods included from FasterCacheKeys

#cache_key

Methods included from Awardable

#awarded_emoji?, #downvotes, #emoji_awardable?, #grouped_awards, #upvotes, #user_authored?, #user_can_award?

Methods included from Mentionable

#all_references, #create_cross_references!, #create_new_cross_references!, #directly_addressed_users, #extractors, #gfm_reference, #local_reference, #matches_cross_reference_regex?, #mentioned_users, #referenced_group_users, #referenced_groups, #referenced_mentionables, #referenced_project_users, #referenced_projects, #referenced_users, #user_mention_class, #user_mention_identifier

Methods included from Participable

#participant?, #participants, #visible_participants

Methods included from Gitlab::Utils::StrongMemoize

#clear_memoization, #strong_memoize, #strong_memoized?

Methods inherited from ApplicationRecord

cached_column_list, #create_or_load_association, declarative_enum, default_select_columns, id_in, id_not_in, iid_in, pluck_primary_key, primary_key_in, #readable_by?, safe_ensure_unique, safe_find_or_create_by, safe_find_or_create_by!, #to_ability_name, underscore, where_exists, where_not_exists, with_fast_read_statement_timeout, without_order

Methods included from SensitiveSerializableHash

#serializable_hash

Instance Method Details

#active?(diff_refs = nil) ⇒ Boolean

Check if this note is part of an “active” discussion

This will always return true for anything except MergeRequest noteables, which have special logic.

If the note's current diff cannot be matched in the MergeRequest's current diff, it's considered inactive.

Returns:

  • (Boolean)

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'app/models/legacy_diff_note.rb', line 53

def active?(diff_refs = nil)
  return @active if defined?(@active)
  return true if for_commit?
  return true unless diff_line
  return false unless noteable
  return false if diff_refs && diff_refs != noteable.diff_refs

  noteable_diff = find_noteable_diff

  if noteable_diff
    parsed_lines = Gitlab::Diff::Parser.new.parse(noteable_diff.diff.each_line)

    @active = parsed_lines.any? { |line_obj| line_obj.text == diff_line.text }
  else
    @active = false
  end

  @active
end

#diffObject


30
31
32
# File 'app/models/legacy_diff_note.rb', line 30

def diff
  @diff ||= Gitlab::Git::Diff.new(st_diff) if st_diff.respond_to?(:map)
end

#diff_fileObject


34
35
36
# File 'app/models/legacy_diff_note.rb', line 34

def diff_file
  @diff_file ||= Gitlab::Diff::File.new(diff, repository: project_repository) if diff
end

#diff_file_hashObject


26
27
28
# File 'app/models/legacy_diff_note.rb', line 26

def diff_file_hash
  line_code.split('_')[0] if line_code
end

#diff_lineObject


38
39
40
# File 'app/models/legacy_diff_note.rb', line 38

def diff_line
  @diff_line ||= diff_file&.line_for_line_code(self.line_code)
end

#discussion_classObject


18
19
20
# File 'app/models/legacy_diff_note.rb', line 18

def discussion_class(*)
  LegacyDiffDiscussion
end

#original_line_codeObject


42
43
44
# File 'app/models/legacy_diff_note.rb', line 42

def original_line_code
  self.line_code
end

#project_repositoryObject


22
23
24
# File 'app/models/legacy_diff_note.rb', line 22

def project_repository
  Gitlab::SafeRequestStore.fetch("project:#{project_id}:repository") { self.project.repository }
end