#! /usr/bin/ruby -w

##
## generated setup/build files that contain version numbers.
##

require 'getoptlong'

VersionTemplate = './sublib/version.in.h'
VersionOut      = './sublib/version.out.h'
VersionOutXml   = './doc/docbook/guide/version.out.xml'

InfoPlistTemplate = './dist/macosx/Info.plist.in'
InfoPlistOutSC    = './dist/macosx/Info.plist.sc'
InfoPlistOutSM    = './dist/macosx/Info.plist.sm'

Uptodate          = 'gen_version.udt'


opts = GetoptLong.new(
  [ "--no-specialbuild", "-n", GetoptLong::NO_ARGUMENT],
  [ "--specialbuild",    "-s", GetoptLong::REQUIRED_ARGUMENT ]
) 



$RevisionTag  = `svnversion .`.chop
$RevisionTag  =~ /(\d+)/
$RevisionNr   = $1
#$Date         = Time.now
$Date = Time.now.strftime("%A %d. %B %Y")

$Major = nil
$Minor = nil
$Patch = nil


$SpecialBuild     = "unset"
$SpecialBuildDesc = "n/a"


opts.each do |opt,arg|

  case opt
    when "--specialbuild"
    
      $SpecialBuild = true
      if arg.empty? then
        printf "--specialbuild expects an argument!\n"
      else
        $SpecialBuildDesc = arg
      end      
      
    when "--no-specialbuild"
      $SpecialBuild = false
    
    else
      printf "unknown option #{opt}!\n"

  end

end


##
## extract major, minor and patch version for creating VersionOutXml below.
##

IO.foreach( VersionTemplate ) {
  | line |
  
  if line.include? "#define SUBCOMMANDER_VER_MAJOR" then
    $Major = line[/\d+/]
  end

  if line.include? "#define SUBCOMMANDER_VER_MINOR" then
    $Minor = line[/\d+/]
  end

  if line.include? "#define SUBCOMMANDER_VER_PATCH" then
    $Patch = line[/\d+/]
  end 
}

##
## display values..
##

printf "Date                     : '#{$Date}'\n"
printf "extracted RevisionNr     : '#{$RevisionNr}'\n"
printf "extracted RevisionTag    : 'r#{$RevisionTag}'\n"
printf "special build            : '#{$SpecialBuild}'\n"
if $SpecialBuild == true then
  printf "special build description: '#{$SpecialBuildDesc}'\n"
end
printf "Major Version            : '#{$Major}'\n"
printf "Minor Version            : '#{$Minor}'\n"
printf "Patch Version            : '#{$Patch}'\n"


##
## up todate check
##

udtnew = "r#{$RevisionTag} #{$SpecialBuild} #{$SpecialBuildDesc}\n"

if FileTest.exists?(Uptodate) then
  
  udt = File.new(Uptodate).gets
    
  if udt == udtnew then
    puts "\nversion info is up-to-date."
    exit
  end
end

puts "\nupdating version info.." 

File.new(Uptodate,"w").puts udtnew



##
## create Subcommander VersionOut
##

out = File.open( VersionOut, "w" )

IO.foreach( VersionTemplate ) {
  | line |

  # create VersionOut by reading VersionTemplate, substituing some values and writing
  # everything to VersionOut.

  line.sub!( /(#define SUBCOMMANDER_VER_REVISION +)\d+/,     '\1'"#{$RevisionNr}" )
  line.sub!( /(#define SUBCOMMANDER_VER_REVISION_TAG +)\S+/, '\1'"\"r#{$RevisionTag}\"" )
  line.sub!( /(#define SUBCOMMANDER_DATE +)\S+/,             '\1'"\"#{$Date}\"" )
  
  if $SpecialBuild == true then
    line.sub!( /(#define SUBCOMMANDER_SPECIALBUILD_DESCRIPTION +).+/, '\1'"\"#{$SpecialBuildDesc}\"" )
  elsif $SpecialBuild == false
    line.sub!( /(#define SUBCOMMANDER_SPECIALBUILD)/, '//\1' )
  end
  
  out.puts line
}

out.close


##
## create Subcommander guide VersionOutXml
##

File.open( VersionOutXml, "w" ) do |file|
  file.puts( 
    '<!-- automatically generated by gen_version.rb -->',
    '<!ENTITY sc.version "'"#{$Major}.#{$Minor}.#{$Patch}"'">',
    '<!ENTITY sc.revision "'"r#{$RevisionTag}"'">',
    '<!ENTITY sc.date "'"#{$Date}"'">'
  )
end


##
## prepare BuildDesc
##

#puts $SpecialBuild

if $SpecialBuild == true then
  $BuildDesc = " #{$SpecialBuildDesc}"
else
  $BuildDesc = ""
end


##
## create inno setup version.iss
##

File.open( "dist/win32/version.iss", "w" ) do |file|

  file.puts(
    '; automatically generated by gen_version.rb',
    'AppVerName=Subcommander '"#{$Major}.#{$Minor}.#{$Patch} (r#{$RevisionTag})#{$BuildDesc}"
  )
end


##
## create MacOSX Info.plist
##


## subcommander Info.plist

out = File.open( InfoPlistOutSC, "w" )

IO.foreach( InfoPlistTemplate ) {
  | line |

  # create the file by reading the template and substituting some values

  line.sub!( /SHORTNAME/, "sc" )
  line.sub!( /LONGNAME/, "subcommander" )
  line.sub!( /SHORTVERSION/, "#{$Major}.#{$Minor}.#{$Patch}" )
  line.sub!( /LONGVERSION/, "#{$Major}.#{$Minor}.#{$Patch} (r#{$RevisionTag})#{$BuildDesc}" )
  line.sub!( /SIGNATURE/, "SUBC" )
  
  out.puts line
}

out.close

## submerge Info.plist

out = File.open( InfoPlistOutSM, "w" )

IO.foreach( InfoPlistTemplate ) {
  | line |

  # create the file by reading the template and substituting some values

  line.sub!( /SHORTNAME/, "sm" )
  line.sub!( /LONGNAME/, "submerge" )
  line.sub!( /SHORTVERSION/, "#{$Major}.#{$Minor}.#{$Patch}" )
  line.sub!( /LONGVERSION/, "#{$Major}.#{$Minor}.#{$Patch} (r#{$RevisionTag})#{$BuildDesc}" )
  line.sub!( /SIGNATURE/, "SUBM" )
  
  out.puts line
}

out.close

syntax highlighted by Code2HTML, v. 0.9.1