117 lines
2.7 KiB
Plaintext
117 lines
2.7 KiB
Plaintext
|
#!/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
|