summaryrefslogtreecommitdiff
path: root/lib/gitlab/git/rev_list.rb
blob: a16b0ed76f436a84b42f003701ac0b92c555b682 (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
module Gitlab
  module Git
    class RevList
      attr_reader :oldrev, :newrev, :path_to_repo

      def initialize(path_to_repo:, newrev:, oldrev: nil)
        @oldrev = oldrev
        @newrev = newrev
        @path_to_repo = path_to_repo
      end

      # This method returns an array of new references
      def new_refs
        execute([*base_args, newrev, '--not', '--all'])
      end

      # This methods returns an array of missed references
      def missed_ref
        execute([*base_args, '--max-count=1', oldrev, "^#{newrev}"])
      end

      private

      def execute(args)
        output, status = Gitlab::Popen.popen(args, nil, Gitlab::Git::Env.all.stringify_keys)

        unless status.zero?
          raise "Got a non-zero exit code while calling out `#{args.join(' ')}`."
        end

        output.split("\n")
      end

      def base_args
        [
          Gitlab.config.git.bin_path,
          "--git-dir=#{path_to_repo}",
          'rev-list'
        ]
      end
    end
  end
end