discourse/lib/upgrade/git_repo.rb

70 lines
1.3 KiB
Ruby

module Upgrade; end
# like Grit just very very minimal
class Upgrade::GitRepo
attr_reader :path
def initialize(path)
@path = path
@memoize = {}
end
def valid?
File.directory?("#{path}/.git")
end
def latest_local_commit
run "rev-parse --short HEAD"
end
def latest_origin_commit
run "rev-parse --short #{tracking_branch}"
end
def latest_origin_commit_date
commit_date(latest_origin_commit)
end
def latest_local_commit_date
commit_date(latest_local_commit)
end
def commits_behind
run("rev-list --count #{tracking_branch}..HEAD").to_i
end
def url
url = run "config --get remote.origin.url"
if url =~ /^git/
# hack so it works with git urls
url = "https://github.com/#{url.split(":")[1]}"
end
end
protected
def commit_date(commit)
unix_timestamp = run('show -s --format="%ct" ' << commit).to_i
Time.at(unix_timestamp).to_datetime
end
def tracking_branch
run "for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)"
end
def ensure_updated
@updated ||= Thread.new do
# this is a very slow operation, make it async
`cd #{path} && git remote update`
end
end
def run(cmd)
ensure_updated
@memoize[cmd] ||= `cd #{path} && git #{cmd}`.strip
rescue => e
p e
end
end