#!/usr/bin/ruby.ruby3.4 

if ARGV[0].nil? or
   ARGV[0].empty? or
   (ARGV.length == 1 && (ARGV[0] == "-d" || ARGV[0] == "--dry-run")) or
   ARGV[0] == '-h' or
   ARGV[0] == '--help'
	$stderr.puts <<-EOF.gsub(/^\t\t/, '')
		Usage: git version-bump [-n|--notes] [-l|--lite-tags] [-d|--dry-run] <major|minor|patch|show>

		'major': x.y.z -> x+1.0.0
		'minor': x.y.z -> x.y+1.0
		'patch': x.y.z -> x.y.z+1

		'show': Display the current GVB version

		-d, --dry-run: Calculate and return the bump value, but don't update git workspace or remote
		-n, --notes: Prompt for "release notes" to add to the release tag
		-l, --lite-tags: Include non-annotated git tags
	EOF
end

release_notes = ARGV.delete('-n') || ARGV.delete('--notes')
dry_run = ARGV.delete('-d') || ARGV.delete('--dry-run')
lite_tags = ARGV.delete('-l') || ARGV.delete('--lite-tags')

if ARGV[0].nil? or ARGV[0].empty?
	exit 1
elsif ARGV[0] == '-h' or ARGV[0] == '--help'
	exit 0
end

begin
  require 'git-version-bump'

  result = case ARGV[0].downcase
    when /^maj?o?r?$/
      "#{GVB.major_version(true) + 1}.0.0"
    when /^min?o?r?$/
      "#{GVB.major_version(true)}.#{GVB.minor_version(true)+1}.0"
    when /^pa?t?c?h?$/
      "#{GVB.major_version(true)}.#{GVB.minor_version(true)}.#{GVB.patch_version(true)+1}"
    when /^sh?o?w?$/
      puts GVB.version(true)
      exit 0
    else
      $stderr.puts "Unknown argument: #{ARGV[0]}.  Try --help."
      exit 1
  end

  if dry_run
    puts result
  else
    unless GVB.tag_version result, release_notes, lite_tags
      exit 1
    end
    puts "Version is now #{GVB.version(true)}."
  end
rescue GVB::VersionUnobtainable => ex
  $stderr.puts "Could not obtain version information.  #{ex.message} (git available: #{GVB.git_available?.inspect})"
  exit 1
rescue GVB::CommandFailure => ex
  $stderr.puts "#{ex.message} (exit status: #{ex.exitstatus})"
  $stderr.puts "command output was:"
  $stderr.puts "----8<----"
  $stderr.puts ex.output
  $stderr.puts "---->8----"
  exit 1
end
