class MGit::Repository

Constants

SIMPLE_FLAGS

Attributes

name[R]
path[R]

Public Class Methods

new(name, path) click to toggle source
# File lib/mgit/repository.rb, line 9
def initialize(name, path)
  @name = name
  @path = path
end

Public Instance Methods

available?() click to toggle source
# File lib/mgit/repository.rb, line 14
def available?
  unless File.directory?(path)
    pwarn "Repository #{name} is not available anymore. Failed to read #{path}."
    return false
  end

  true
end
branches() click to toggle source
# File lib/mgit/repository.rb, line 38
def branches
  in_repo do
    System.git('branch --no-color')
      .stdout
      .strip
      .split("\n")
      .map { |b| b.split(' ') }
      .map { |b| { name: b.last, current: (b.size == 2) } }
  end
end
chdir()
Alias for: in_repo
current_branch() click to toggle source
# File lib/mgit/repository.rb, line 23
def current_branch
  in_repo do
    sc = System.git('rev-parse --abbrev-ref HEAD')
    sc.success? ? sc.stdout.strip : 'HEAD'
  end
end
current_head() click to toggle source
# File lib/mgit/repository.rb, line 30
def current_head
  in_repo { System.git('rev-parse --verify --short HEAD').stdout.strip }
end
dirty?() click to toggle source
# File lib/mgit/repository.rb, line 126
def dirty?
  [:index, :dirty].any? { |f| flags.include?(f) }
end
divergence() click to toggle source
# File lib/mgit/repository.rb, line 108
def divergence
  divergence = []
  status_lines do |s|
    if s.split[0] == '##'
      if (m = %r{## ([\w,/]+)\.\.\.([\w,/]+) \[ahead (\d+), behind (\d+)\]}.match(s))
        divergence << { ahead: { branch: m[2], by: m[3] }, behind: { branch: m[2], by: m[4] } }
      elsif (m = %r{## ([\w,/]+)\.\.\.([\w,/]+) \[(\w+) (\d+)\]}.match(s))
        if m[3] =~ /behind/
          divergence << { behind: { branch: m[2], by: m[4] } }
        else
          divergence << { ahead: { branch: m[2], by: m[4] } }
        end
      end
    end
  end
  divergence
end
flags() click to toggle source
# File lib/mgit/repository.rb, line 88
def flags
  flags = Set.new
  status_lines do |s|
    indicator = s.split[0]

    case indicator
    when *SIMPLE_FLAGS.keys
      flags << SIMPLE_FLAGS[indicator]
    when '##'
      if %r{## [\w,/]+\.\.\.[\w,/]+ \[.+\]} =~ s
        flags << :diverged
      elsif /## HEAD \(no branch\)/ =~ s
        flags << :detached
      end
    end
  end

  flags
end
has_commit?(obj) click to toggle source
# File lib/mgit/repository.rb, line 34
def has_commit?(obj)
  in_repo { !(System.git("rev-parse --quiet --verify #{obj}").stdout.empty?) }
end
in_repo() { || ... } click to toggle source
# File lib/mgit/repository.rb, line 130
def in_repo
  Dir.chdir(path) { yield }
end
Also aliased as: chdir
remote_branches() click to toggle source
# File lib/mgit/repository.rb, line 64
def remote_branches
  in_repo do
    System.git('branch -r').stdout.split("\n").map { |a| a.split(' ')[0] }
  end
end
remote_tracking_branches(upstream_exists_only = true) click to toggle source
# File lib/mgit/repository.rb, line 49
def remote_tracking_branches(upstream_exists_only = true)
  rb = remote_branches

  a = in_repo do
    System.git("for-each-ref --format='%(refname:short) %(upstream:short)' refs/heads")
      .stdout
      .split("\n")
      .map { |b| b.split(' ') }
      .reject { |b| b.size != 2 }
      .select { |b| !upstream_exists_only || rb.include?(b[1]) }
  end

  Hash[a]
end
unmerged_commits(branch, upstream) click to toggle source
# File lib/mgit/repository.rb, line 70
def unmerged_commits(branch, upstream)
  in_repo do
    System.git("log --pretty=format:'%h#%an#%s' --reverse  --relative-date #{branch}..#{upstream}")
      .stdout
      .split("\n")
      .map { |line| line.split('#') }
      .map do |words|
        {
          commit: words[0],
          author: words[1],
          subject: words[2..-1].join('#')
        }
      end
  end
end

Private Instance Methods

status() click to toggle source
# File lib/mgit/repository.rb, line 138
def status
  @status ||= in_repo { System.git('status --short --branch --ignore-submodules').stdout.split("\n") }
end
status_lines() { |s| ... } click to toggle source
# File lib/mgit/repository.rb, line 142
def status_lines
  status.each { |s| yield s }
end