dotfiles/bin/git-game

117 lines
2.7 KiB
Plaintext
Raw Normal View History

2017-04-06 14:23:57 +02:00
#!/usr/bin/ruby
longest_streak = streak = 0
# -- Exit gracefully --
Signal.trap("INT") {
puts "\nLongest streak: #{longest_streak}"
exit 0
}
def print_header
puts "----------------------------------------------------------"
puts " THE GIT GAME "
puts "----------------------------------------------------------"
puts "Welcome! The goal of the git game is to guess committers"
puts "based on their commit messages.\n\n"
end
def print_help
puts "----------------------------------------------------------"
puts " USAGE "
puts "----------------------------------------------------------"
puts "git game [extra git log options]"
puts "EX: git game --after={2014-08-08}"
puts "(This script already uses --no-merges and --pretty."
puts "For more valid options see: http://gitref.org/inspect/)"
end
# -- Usage Text --
if ARGV.count > 0 && (input = ARGV.shift) == 'help'
print_header
print_help
exit 0
end
# -- Parse commits --
COMMIT_DELIMITER = "XXXCOMMITXXX"
FIELD_DELIMITER = "|||"
commit_format = ["%an", "%ar", "%B"].join(FIELD_DELIMITER)
raw_commits = `git log --no-merges --pretty="#{COMMIT_DELIMITER}#{commit_format}" #{input if input}`.split("#{COMMIT_DELIMITER}")
commits = []
raw_commits.each do |c|
next if c.strip.empty?
fields = c.split(FIELD_DELIMITER)
commits << {:author => fields[0], :date => fields[1], :message => fields[2]}
end
committers = commits.map { |c| c[:author] }.compact.uniq
# -- Show welcome message --
system('clear')
print_header
puts "You're playing in a repo with #{commits.size} commits and #{committers.size}"
puts "distinct committers.\n\n"
committers.each do |committer|
puts committer
end
puts "Ready? PRESS ENTER TO START PLAYING (Ctrl-C to quit)"
gets
system('clear')
# -- Game loop --
NUM_CHOICE = 4
loop do
commit = commits.shuffle.pop
message = commit[:message]
author = commit[:author]
next if message.nil? || message.empty? || author.nil? || author.empty?
puts "(#{commit[:date]})\n"
puts "#{message.strip}\n\n"
puts
choices = committers.sample(NUM_CHOICE)
if !choices.include?(author)
choices.pop
choices.push author
end
choices.shuffle!
choices.each_with_index do |name, index|
puts "[#{index + 1}] #{name}"
end
print "Who wrote it (current streak: #{streak})? "
guess = gets.strip
while guess.empty? || !guess.to_i.between?(1, NUM_CHOICE)
print "Who wrote it (current streak: #{streak})? "
guess = gets.strip
end
if choices[guess.to_i - 1] == author
streak += 1
puts "Got it!"
else
streak = 0
puts "Actually, it was #{author}."
end
longest_streak = [longest_streak, streak].max
sleep 1
system('clear')
end