| // Copyright (C) 2018 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| syntax = "proto3"; |
| |
| package gerrit.cache; |
| |
| option java_package = "com.google.gerrit.server.cache.proto"; |
| |
| import "proto/entities.proto"; |
| |
| // Serialized form of com.google.gerrit.server.change.ChangeKindCacheImpl.Key. |
| // Next ID: 4 |
| message ChangeKindKeyProto { |
| bytes prior = 1; |
| bytes next = 2; |
| string strategy_name = 3; |
| } |
| |
| // Serialized form of |
| // com.google.gerrit.server.change.MergeabilityCacheImpl.EntryKey. |
| // Next ID: 5 |
| message MergeabilityKeyProto { |
| bytes commit = 1; |
| bytes into = 2; |
| string submit_type = 3; |
| string merge_strategy = 4; |
| } |
| |
| // Serialized form of com.google.gerrit.extensions.auth.oauth.OAuthToken. |
| // Next ID: 6 |
| message OAuthTokenProto { |
| string token = 1; |
| string secret = 2; |
| string raw = 3; |
| // Epoch millis. |
| int64 expires_at_millis = 4; |
| string provider_id = 5; |
| } |
| |
| |
| // Serialized form of com.google.gerrit.server.notedb.ChangeNotesCache.Key. |
| // Next ID: 4 |
| message ChangeNotesKeyProto { |
| string project = 1; |
| int32 change_id = 2; |
| bytes id = 3; |
| } |
| |
| // Serialized from of com.google.gerrit.server.notedb.ChangeNotesState. |
| // |
| // Note on embedded protos: this is just for storing in a cache, so some formats |
| // were chosen ease of coding the initial implementation. In particular, where |
| // there already exists another serialization mechanism in Gerrit for |
| // serializing a particular field, we use that rather than defining a new proto |
| // type. This includes types that can be serialized to proto using |
| // ProtoConverters as well as NoteDb and indexed types that are serialized using |
| // JSON. We can always revisit this decision later; it just requires bumping the |
| // cache version. |
| // |
| // Note on nullability: there are a lot of nullable fields in ChangeNotesState |
| // and its dependencies. It's likely we could make some of them non-nullable, |
| // but each one of those would be a potentially significant amount of cleanup, |
| // and there's no guarantee we'd be able to eliminate all of them. (For a less |
| // complex class, it's likely the cleanup would be more feasible.) |
| // |
| // Instead, we just take the tedious yet simple approach of having a "has_foo" |
| // field for each nullable field "foo", indicating whether or not foo is null. |
| // |
| // Next ID: 29 |
| message ChangeNotesStateProto { |
| // Effectively required, even though the corresponding ChangeNotesState field |
| // is optional, since the field is only absent when NoteDb is disabled, in |
| // which case attempting to use the ChangeNotesCache is programmer error. |
| bytes meta_id = 1; |
| |
| int32 change_id = 2; |
| |
| // Next ID: 26 |
| message ChangeColumnsProto { |
| string change_key = 1; |
| |
| // Epoch millis. |
| int64 created_on_millis = 2; |
| |
| // Epoch millis. |
| int64 last_updated_on_millis = 3; |
| |
| int32 owner = 4; |
| |
| string branch = 5; |
| |
| int32 current_patch_set_id = 6; |
| bool has_current_patch_set_id = 7; |
| |
| string subject = 8; |
| |
| string topic = 9; |
| bool has_topic = 10; |
| |
| string original_subject = 11; |
| bool has_original_subject = 12; |
| |
| string submission_id = 13; |
| bool has_submission_id = 14; |
| |
| reserved 15; // assignee |
| reserved 16; // has_assignee |
| |
| string status = 17; |
| bool has_status = 18; |
| |
| bool is_private = 19; |
| |
| bool work_in_progress = 20; |
| |
| bool review_started = 21; |
| |
| int32 revert_of = 22; |
| bool has_revert_of = 23; |
| |
| string cherry_pick_of = 24; |
| bool has_cherry_pick_of = 25; |
| } |
| // Effectively required, even though the corresponding ChangeNotesState field |
| // is optional, since the field is only absent when NoteDb is disabled, in |
| // which case attempting to use the ChangeNotesCache is programmer error. |
| ChangeColumnsProto columns = 3; |
| |
| reserved 4; // past_assignee |
| |
| repeated string hashtag = 5; |
| |
| map<string, string> custom_keyed_values = 28; |
| |
| repeated devtools.gerritcodereview.PatchSet patch_set = 6; |
| |
| repeated devtools.gerritcodereview.PatchSetApproval approval = 7; |
| |
| // Next ID: 4 |
| message ReviewerSetEntryProto { |
| string state = 1; |
| int32 account_id = 2; |
| // Epoch millis. |
| int64 timestamp_millis = 3; |
| } |
| repeated ReviewerSetEntryProto reviewer = 8; |
| |
| // Next ID: 4 |
| message ReviewerByEmailSetEntryProto { |
| string state = 1; |
| string address = 2; |
| // Epoch millis. |
| int64 timestamp_millis = 3; |
| } |
| repeated ReviewerByEmailSetEntryProto reviewer_by_email = 9; |
| |
| repeated ReviewerSetEntryProto pending_reviewer = 10; |
| |
| repeated ReviewerByEmailSetEntryProto pending_reviewer_by_email = 11; |
| |
| repeated int32 past_reviewer = 12; |
| |
| // Next ID: 8 |
| message ReviewerStatusUpdateProto { |
| // Epoch millis. |
| int64 timestamp_millis = 1; |
| int32 updated_by = 2; |
| |
| // Account ID of the reviewer. |
| // Not set if a reviewer for which no Gerrit account exists is added by email. |
| int32 reviewer = 3; |
| bool has_reviewer = 5; |
| |
| // Address of the reviewer by email (can be "Full Name <full.name@example.com>" or |
| // "full.name@example.com"). |
| // Only set for reviewers that have no Gerrit account and that have been added by email. |
| string reviewer_by_email = 6; |
| bool has_reviewer_by_email = 7; |
| |
| string state = 4; |
| } |
| repeated ReviewerStatusUpdateProto reviewer_update = 13; |
| |
| // JSON produced from |
| // com.google.gerrit.server.index.change.ChangeField.StoredSubmitRecord. |
| repeated string submit_record = 14; |
| |
| repeated devtools.gerritcodereview.ChangeMessage change_message = 15; |
| |
| // JSON produced from com.google.gerrit.entities.Comment. |
| repeated string published_comment = 16; |
| |
| reserved 17; // read_only_until |
| reserved 18; // has_read_only_until |
| |
| // Number of updates to the change's meta ref. |
| int32 update_count = 19; |
| |
| string server_id = 20; |
| bool has_server_id = 21; |
| |
| reserved 22; // assignee_update; |
| |
| // An update to the attention set of the change. See class AttentionSetUpdate |
| // for context. |
| message AttentionSetUpdateProto { |
| // Epoch millis. |
| int64 timestamp_millis = 1; |
| int32 account = 2; |
| // Maps to enum AttentionSetUpdate.Operation |
| string operation = 3; |
| string reason = 4; |
| } |
| // Only includes the most recent attention set update for each user. |
| repeated AttentionSetUpdateProto attention_set_update = 23; |
| |
| // Includes all attention set updates. |
| repeated AttentionSetUpdateProto all_attention_set_update = 24; |
| |
| // Epoch millis. |
| int64 merged_on_millis = 25; |
| bool has_merged_on = 26; |
| |
| repeated SubmitRequirementResultProto submit_requirement_result = 27; |
| } |
| |
| // Serialized form of com.google.gerrit.server.query.change.ConflictKey |
| message ConflictKeyProto { |
| bytes commit = 1; |
| bytes other_commit = 2; |
| string submit_type = 3; |
| bool content_merge = 4; |
| } |
| |
| // Serialized form of com.google.gerrit.server.query.git.TagSetHolder. |
| // Next ID: 3 |
| message TagSetHolderProto { |
| string project_name = 1; |
| |
| // Next ID: 4 |
| message TagSetProto { |
| string project_name = 1; |
| |
| // Next ID: 3 |
| message CachedRefProto { |
| bytes id = 1; |
| int32 flag = 2; |
| } |
| map<string, CachedRefProto> ref = 2; |
| |
| // Next ID: 3 |
| message TagProto { |
| bytes id = 1; |
| bytes flags = 2; // org.roaringbitmap.RoaringBitmap serialized as ByteString |
| } |
| repeated TagProto tag = 3; |
| } |
| TagSetProto tags = 2; |
| } |
| |
| // Serialized form of |
| // com.google.gerrit.server.account.externalids.AllExternalIds. |
| // Next ID: 2 |
| message AllExternalIdsProto { |
| // Next ID: 7 |
| message ExternalIdProto { |
| string key = 1; |
| int32 accountId = 2; |
| string email = 3; |
| string password = 4; |
| bytes blobId = 5; |
| bool isCaseInsensitive = 6; |
| } |
| repeated ExternalIdProto external_id = 1; |
| } |
| |
| // Serialized form of a list of com.google.gerrit.entities.AccountGroup.UUID |
| // Next ID: 2 |
| message AllExternalGroupsProto { |
| message ExternalGroupProto { |
| string groupUuid = 1; |
| } |
| repeated ExternalGroupProto external_group = 1; |
| } |
| |
| // Serialized key for com.google.gerrit.server.account.GroupCacheImpl. |
| // Next ID: 3 |
| message GroupKeyProto { |
| string uuid = 1; |
| bytes revision = 2; |
| } |
| |
| |
| // Serialized form of com.google.gerrit.entities.InternalGroup. |
| // Next ID: 11 |
| message InternalGroupProto { |
| int32 id = 1; |
| string name = 2; |
| string description = 3; |
| string owner_group_uuid = 4; |
| bool is_visible_to_all = 5; |
| string group_uuid = 6; |
| int64 created_on = 7; |
| repeated int32 members_ids = 8; |
| repeated string subgroup_uuids = 9; |
| bytes ref_state = 10; |
| } |
| |
| // Key for com.google.gerrit.server.git.PureRevertCache. |
| // Next ID: 4 |
| message PureRevertKeyProto { |
| string project = 1; |
| bytes claimed_original = 2; |
| bytes claimed_revert = 3; |
| } |
| |
| // Key for com.google.gerrit.server.account.ProjectWatches. |
| // Next ID: 4 |
| message ProjectWatchProto { |
| string project = 1; |
| string filter = 2; |
| repeated string notify_type = 3; |
| } |
| |
| // Serialized user preferences. |
| // Next ID: 3 |
| message CachedPreferencesProto { |
| oneof Preferences { |
| devtools.gerritcodereview.UserPreferences user_preferences = 1; |
| string legacy_git_config = 2; |
| } |
| } |
| |
| // Serialized form of |
| // com.google.gerrit.entities.Account. |
| // Next ID: 9 |
| message AccountProto { |
| int32 id = 1; |
| int64 registered_on = 2; |
| string full_name = 3; |
| string display_name = 4; |
| string preferred_email = 5; |
| bool inactive = 6; |
| string status = 7; |
| string meta_id = 8; |
| string unique_tag = 9; |
| } |
| |
| // Serialized form of com.google.gerrit.server.account.CachedAccountDetails.Key. |
| // Next ID: 3 |
| message AccountKeyProto { |
| int32 account_id = 1; |
| bytes id = 2; |
| } |
| |
| // Serialized form of com.google.gerrit.server.account.CachedAccountDetails. |
| // Next ID: 5 |
| message AccountDetailsProto { |
| AccountProto account = 1; |
| repeated ProjectWatchProto project_watch_proto = 2; |
| CachedPreferencesProto user_preferences = 4; |
| reserved 3; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.Project. |
| // Next ID: 11 |
| message ProjectProto { |
| string name = 1; |
| string description = 2; |
| map<string, string> boolean_configs = 3; |
| string submit_type = 4; // ENUM as String |
| string state = 5; // ENUM as String |
| string parent = 6; |
| string max_object_size_limit = 7; |
| string default_dashboard = 8; |
| string local_default_dashboard = 9; |
| string config_ref_state = 10; |
| } |
| |
| // Serialized form of com.google.gerrit.common.data.GroupReference. |
| // Next ID: 3 |
| message GroupReferenceProto { |
| string uuid = 1; |
| string name = 2; |
| } |
| |
| // Serialized form of com.google.gerrit.common.data.PermissionRule. |
| // Next ID: 6 |
| message PermissionRuleProto { |
| string action = 1; // ENUM as String |
| bool force = 2; |
| int32 min = 3; |
| int32 max = 4; |
| GroupReferenceProto group = 5; |
| } |
| |
| // Serialized form of com.google.gerrit.common.data.Permission. |
| // Next ID: 4 |
| message PermissionProto { |
| string name = 1; |
| bool exclusive_group = 2; |
| repeated PermissionRuleProto rules = 3; |
| } |
| |
| // Serialized form of com.google.gerrit.common.data.AccessSection. |
| // Next ID: 3 |
| message AccessSectionProto { |
| string name = 1; |
| repeated PermissionProto permissions = 2; |
| } |
| |
| // Serialized form of com.google.gerrit.server.git.BranchOrderSection. |
| // Next ID: 2 |
| message BranchOrderSectionProto { |
| repeated string branches_in_order = 1; |
| } |
| |
| // Serialized form of com.google.gerrit.common.data.ContributorAgreement. |
| // Next ID: 8 |
| message ContributorAgreementProto { |
| string name = 1; |
| string description = 2; |
| repeated PermissionRuleProto accepted = 3; |
| GroupReferenceProto auto_verify = 4; |
| string url = 5; |
| repeated string exclude_regular_expressions = 6; |
| repeated string match_regular_expressions = 7; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.Address. |
| // Next ID: 3 |
| message AddressProto { |
| string name = 1; |
| string email = 2; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.NotifyConfig. |
| // Next ID: 7 |
| message NotifyConfigProto { |
| string name = 1; |
| repeated string type = 2; // ENUM as String |
| string filter = 3; |
| string header = 4; // ENUM as String |
| repeated GroupReferenceProto groups = 5; |
| repeated AddressProto addresses = 6; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.LabelValue. |
| // Next ID: 3 |
| message LabelValueProto { |
| string text = 1; |
| int32 value = 2; |
| } |
| |
| // Serialized form of com.google.gerrit.common.data.LabelType. |
| // Next ID: 22 |
| message LabelTypeProto { |
| string name = 1; |
| string function = 2; // ENUM as String |
| reserved 3; // copy_any_score |
| reserved 4; // copy_min_score |
| reserved 5; // copy_max_score |
| reserved 6; // copy_all_scores_on_merge_first_parent_update |
| reserved 7; // copy_all_scores_on_trivial_rebase |
| reserved 8; // copy_all_scores_if_no_code_change |
| reserved 9; // copy_all_scores_if_no_change |
| reserved 10; // copy_values |
| bool allow_post_submit = 11; |
| bool ignore_self_approval = 12; |
| int32 default_value = 13; |
| repeated LabelValueProto values = 14; |
| int32 max_negative = 15; |
| int32 max_positive = 16; |
| bool can_override = 17; |
| repeated string ref_patterns = 18; |
| reserved 19; // copy_all_scores_if_list_of_files_did_not_change |
| string copy_condition = 20; |
| string description = 21; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.SubmitRequirement. |
| // Next ID: 7 |
| message SubmitRequirementProto { |
| string name = 1; |
| string description = 2; |
| string applicability_expression = 3; |
| string submittability_expression = 4; |
| string override_expression = 5; |
| bool allow_override_in_child_projects = 6; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.SubmitRequirementResult. |
| // Next ID: 9 |
| message SubmitRequirementResultProto { |
| SubmitRequirementProto submit_requirement = 1; |
| SubmitRequirementExpressionResultProto applicability_expression_result = 2; |
| SubmitRequirementExpressionResultProto submittability_expression_result = 3; |
| SubmitRequirementExpressionResultProto override_expression_result = 4; |
| |
| // Patchset commit ID at which the submit requirements are evaluated. |
| bytes commit = 5; |
| |
| // Whether this result was created from a legacy submit record. |
| bool legacy = 6; |
| |
| // Whether the submit requirement was bypassed during submission (i.e. by |
| // performing a push with the %submit option). |
| bool forced = 7; |
| // Whether this submit requirement result should be filtered out when returned |
| // from REST API. |
| bool hidden = 8; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.SubmitRequirementExpressionResult. |
| // Next ID: 6 |
| message SubmitRequirementExpressionResultProto { |
| string expression = 1; |
| string status = 2; // enum as string |
| string error_message = 3; |
| repeated string passing_atoms = 4; |
| repeated string failing_atoms = 5; |
| } |
| |
| // Serialized form of com.google.gerrit.server.project.ConfiguredMimeTypes. |
| // Next ID: 4 |
| message ConfiguredMimeTypeProto { |
| string type = 1; |
| string pattern = 2; |
| bool is_regular_expression = 3; |
| } |
| |
| // Serialized form of com.google.gerrit.common.data.SubscribeSection. |
| // Next ID: 4 |
| message SubscribeSectionProto { |
| string project_name = 1; |
| repeated string multi_match_ref_specs = 2; |
| repeated string matching_ref_specs = 3; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.StoredCommentLinkInfo. |
| // Next ID: 10 |
| message StoredCommentLinkInfoProto { |
| reserved 4; // html |
| |
| string name = 1; |
| string match = 2; |
| bool enabled = 5; |
| bool override_only = 6; |
| string link = 3; |
| string prefix = 7; |
| string suffix = 8; |
| string text = 9; |
| } |
| |
| // Serialized form of com.google.gerrit.entities.CachedProjectConfigProto. |
| // Next ID: 20 |
| message CachedProjectConfigProto { |
| ProjectProto project = 1; |
| repeated GroupReferenceProto group_list = 2; |
| repeated PermissionRuleProto accounts_section = 3; |
| repeated AccessSectionProto access_sections = 4; |
| BranchOrderSectionProto branch_order_section = 5; |
| repeated ContributorAgreementProto contributor_agreements = 6; |
| repeated NotifyConfigProto notify_configs = 7; |
| repeated LabelTypeProto label_sections = 8; |
| repeated ConfiguredMimeTypeProto mime_types = 9; |
| repeated SubscribeSectionProto subscribe_sections = 10; |
| repeated StoredCommentLinkInfoProto comment_links = 11; |
| bytes rules_id = 12; |
| bytes revision = 13; |
| int64 max_object_size_limit = 14; |
| bool check_received_objects = 15; |
| map<string, ExtensionPanelSectionProto> extension_panels = 16; |
| map<string, string> plugin_configs = 17; |
| map<string, string> project_level_configs = 18; |
| repeated SubmitRequirementProto submit_requirement_sections = 19; |
| |
| // Next ID: 2 |
| message ExtensionPanelSectionProto { |
| repeated string section = 1; |
| } |
| } |
| |
| // Serialized key for com.google.gerrit.server.project.ProjectCacheImpl. |
| // Next ID: 4 |
| message ProjectCacheKeyProto { |
| string project = 1; |
| bytes revision = 2; |
| bytes global_config_revision = 3; // Hash of All-Projects-projects.config. This |
| // will only be populated for All-Projects. |
| } |
| |
| // Serialized form of com.google.gerrit.server.comment.CommentContextCacheImpl.Key |
| // Next ID: 7 |
| message CommentContextKeyProto { |
| string project = 1; |
| string change_id = 2; |
| int32 patchset = 3; |
| string commentId = 4; |
| |
| // hashed with the murmur3_128 hash function |
| string path_hash = 5; |
| |
| int32 context_padding = 6; |
| } |
| |
| // Serialized form of a list of com.google.gerrit.extensions.common.ContextLineInfo |
| // Next ID: 3 |
| message AllCommentContextProto { |
| message CommentContextProto { |
| int32 line_number = 1; |
| string context_line = 2; |
| } |
| repeated CommentContextProto context = 1; |
| string content_type = 2; |
| } |
| |
| // Serialized key for |
| // com.google.gerrit.server.patch.gitdiff.GitModifiedFilesCacheKey |
| // Next ID: 5 |
| message GitModifiedFilesKeyProto { |
| string project = 1; |
| bytes a_tree = 2; // SHA-1 hash of the left git tree ID in the diff |
| bytes b_tree = 3; // SHA-1 hash of the right git tree ID in the diff |
| int32 rename_score = 4; |
| } |
| |
| // Serialized key for |
| // com.google.gerrit.server.patch.diff.ModifiedFilesCacheKey |
| // Next ID: 5 |
| message ModifiedFilesKeyProto { |
| string project = 1; |
| bytes a_commit = 2; // SHA-1 hash of the left commit ID in the diff |
| bytes b_commit = 3; // SHA-1 hash of the right commit ID in the diff |
| int32 rename_score = 4; |
| } |
| |
| // Serialized form of com.google.gerrit.server.patch.gitdiff.ModifiedFile |
| // Next ID: 4 |
| message ModifiedFileProto { |
| string change_type = 1; // ENUM as string |
| string old_path = 2; |
| string new_path = 3; |
| } |
| |
| // Serialized form of a collection of |
| // com.google.gerrit.server.patch.gitdiff.ModifiedFile |
| // Next ID: 2 |
| message ModifiedFilesProto { |
| repeated ModifiedFileProto modifiedFile = 1; |
| } |
| |
| // Serialized form of a collection of |
| // com.google.gerrit.server.patch.gitfilediff.GitFileDiffCacheImpl.Key |
| // Next ID: 9 |
| message GitFileDiffKeyProto { |
| string project = 1; |
| bytes a_tree = 2; |
| bytes b_tree = 3; |
| string file_path = 4; |
| int32 rename_score = 5; |
| string diff_algorithm = 6; // ENUM as string |
| string whitepsace = 7; // ENUM as string |
| bool useTimeout = 8; |
| } |
| |
| // Serialized form of com.google.gerrit.server.patch.gitfilediff.GitFileDiff |
| // Next ID: 12 |
| message GitFileDiffProto { |
| message Edit { |
| int32 begin_a = 1; |
| int32 end_a = 2; |
| int32 begin_b = 3; |
| int32 end_b = 4; |
| } |
| repeated Edit edits = 1; |
| string file_header = 2; |
| string old_path = 3; |
| string new_path = 4; |
| bytes old_id = 5; |
| bytes new_id = 6; |
| string old_mode = 7; // ENUM as string |
| string new_mode = 8; // ENUM as string |
| string change_type = 9; // ENUM as string |
| string patch_type = 10; // ENUM as string |
| bool negative = 11; |
| } |
| |
| // Serialized form of |
| // com.google.gerrit.server.patch.fileDiff.FileDiffCacheKey |
| // Next ID: 9 |
| message FileDiffKeyProto { |
| string project = 1; |
| bytes old_commit = 2; |
| bytes new_commit = 3; |
| string file_path = 4; |
| int32 rename_score = 5; |
| string diff_algorithm = 6; |
| string whitespace = 7; |
| bool useTimeout = 8; |
| } |
| |
| // Serialized form of |
| // com.google.gerrit.server.patch.filediff.FileDiffOutput |
| // Next ID: 15 |
| message FileDiffOutputProto { |
| // Next ID: 5 |
| message Edit { |
| int32 begin_a = 1; |
| int32 end_a = 2; |
| int32 begin_b = 3; |
| int32 end_b = 4; |
| } |
| // Serialized form of com.google.gerrit.server.patch.filediff.TaggedEdit |
| // Next ID: 3 |
| message TaggedEdit { |
| Edit edit = 1; |
| bool due_to_rebase = 2; |
| } |
| // Next ID: 3 |
| message ComparisonType { |
| int32 parent_num = 1; |
| bool auto_merge = 2; |
| } |
| string old_path = 1; |
| string new_path = 2; |
| string change_type = 3; |
| string patch_type = 4; |
| repeated string header_lines = 5; |
| int64 size = 6; |
| int64 size_delta = 7; |
| repeated TaggedEdit edits = 8; |
| bytes old_commit = 9; |
| bytes new_commit = 10; |
| ComparisonType comparison_type = 11; |
| bool negative = 12; |
| string old_mode = 13; // ENUM as string |
| string new_mode = 14; // ENUM as string |
| } |