Welcome to mirror list, hosted at ThFree Co, Russian Federation.

custom_diff.rb « diff « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 3928ece9281c97278eb901a98866e828a3d384fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# frozen_string_literal: true
module Gitlab
  module Diff
    module CustomDiff
      class << self
        def preprocess_before_diff(path, old_blob, new_blob)
          return unless path.ends_with? '.ipynb'

          transformed_diff(old_blob&.data, new_blob&.data)&.tap do
            transformed_for_diff(new_blob, old_blob)
            Gitlab::AppLogger.info({ message: 'IPYNB_DIFF_GENERATED' })
          end
        rescue IpynbDiff::InvalidNotebookError => e
          Gitlab::ErrorTracking.log_exception(e)
          nil
        end

        def transformed_diff(before, after)
          transformed_diff = IpynbDiff.diff(before, after,
                                            diff_opts: { context: 5, include_diff_info: true },
                                            transform_options: { cell_decorator: :percent },
                                            raise_if_invalid_notebook: true)
          strip_diff_frontmatter(transformed_diff)
        end

        def transformed_blob_language(blob)
          'md' if transformed_for_diff?(blob)
        end

        def transformed_blob_data(blob)
          if transformed_for_diff?(blob)
            IpynbDiff.transform(blob.data,
                                raise_errors: true,
                                options: { include_metadata: false, cell_decorator: :percent })
          end
        end

        def strip_diff_frontmatter(diff_content)
          diff_content.scan(/.*\n/)[2..]&.join('') if diff_content.present?
        end

        def blobs_with_transformed_diffs
          @blobs_with_transformed_diffs ||= {}
        end

        def transformed_for_diff?(blob)
          blobs_with_transformed_diffs[blob]
        end

        def transformed_for_diff(*blobs)
          blobs.each do |b|
            blobs_with_transformed_diffs[b] = true if b
          end
        end
      end
    end
  end
end