opsi.opsi-builder/libexec/gitlog-to-deblog.rb

92 lines
2.4 KiB
Ruby
Executable File

#!/usr/bin/ruby
require 'erb'
# Determines package name from the origin url on github. It's hackish, but it
# works (mostly).
def pkgname
# originurl = `basename $(git config --get remote.origin.url)`.strip
pkgname = `basename $(git config --get remote.origin.url) .git | tr '\n' ' '`
# _, pkgname = originurl.match(/\/([a-z0-9\-_]+).git/i).to_a
pkgname
end
# Accepts a hash of git log data and returns a properly formatted debian
# changelog entry.
def debchangelog(logdata)
template = <<-EOF
<%=PKGNAME%> (<%=logdata[:tag]%>) unstable; urgency=low
* <%=logdata[:subj]%>
-- <%=logdata[:name]%> <%=logdata[:date]%>
EOF
ERB.new(template).result(binding)
end
# Checks to see if the repository has any tags already.
def repo_has_tag?
`git describe --tags 2>&1`
return ($? == 0)? true : false
end
# If the repository has no tags, we need to make one so we can get some kind
# of versioning number for the changelog.
def make_temporary_tag
firstcommit = `git log --format=%H | tail -1`.strip
`git tag #{TEMPTAG} #{firstcommit}`
end
# Removes the tag we added if the repo had no tags.
def cleanup_temporary_tag
`git tag -d #{TEMPTAG}`
end
# Removes jenkins build tags (if they exist)
def remove_jenkins_tags
IO.popen("git tag -l 'jenkins-*'").readlines.each do |tag|
`git tag -d #{tag}`
end
end
# Get the name of this repository
PKGNAME = pkgname
# Name for the temporary tag (only used if the repository has no tags)
TEMPTAG = 'GOPSI'
#TEMPTAG = pkgname
remove_jenkins_tags
if repo_has_tag?
dotagcleanup = false
else
dotagcleanup = true
make_temporary_tag
end
# Loop through the git log output and grab four lines at a time to parse.
gitlogcmd = %{git log --pretty=format:'hash: %H%nname: %aN <%aE>%ndate: %cD%nsubj: %s'}
IO.popen(gitlogcmd).readlines.each_slice(4) do |chunk|
temphash = {}
# split each line on the first colon and use what's on the left as the
# symbols within the hash
chunk.map { |line| line.split(/: /,2) }.each do |type, data|
temphash[type.to_sym] = data.strip
end
# dig up the most recent tag which contains the commit
temphash[:tag] = `git describe --tags #{temphash[:hash]} 2>/dev/null`.strip
if $? != 0
dotagcleanup = true
make_temporary_tag
temphash[:tag] = `git describe --tags #{temphash[:hash]}`.strip
end
puts debchangelog(temphash)
end
# If we added a temporary tag, let's remove it
cleanup_temporary_tag