begin making the release script properly handle checkouts from branches and
tags; still missing the whole tagging debacle, though. svn path=/trunk/extragear/sysadmin/partitionmanager/; revision=1070498
This commit is contained in:
parent
f09f60029f
commit
e92f3f1e38
|
@ -1,6 +1,6 @@
|
|||
=begin
|
||||
***************************************************************************
|
||||
* Copyright (C) 2008-2009 by Volker Lanz <vl@fidra.de> *
|
||||
* Copyright (C) 2008,2009,2010 by Volker Lanz <vl@fidra.de> *
|
||||
* Copyright (C) 2007-2008 by Harald Sitter <harald@getamarok.com> *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -29,10 +29,13 @@ require 'getoptlong'
|
|||
class ReleaseBuilder
|
||||
|
||||
public
|
||||
def initialize(app, workingDir, repository, version)
|
||||
def initialize(checkoutFrom, checkoutTag, app, workingDir, protocol, user, version)
|
||||
@checkoutFrom = checkoutFrom
|
||||
@checkoutTag = checkoutTag
|
||||
@app = app
|
||||
@workingDir = workingDir
|
||||
@repository = repository
|
||||
@protocol = protocol
|
||||
@user = user
|
||||
@version = version
|
||||
|
||||
@outputDir = "#{@app.name}-#{@version}"
|
||||
|
@ -41,17 +44,18 @@ public
|
|||
FileUtils.rm_rf "#{@outputDir}.tar.bz2"
|
||||
end
|
||||
|
||||
def run(protocol, user, createTarball, getTranslations, skipBelow, getDocs, createTag, applyFixes)
|
||||
def run(createTarball, getTranslations, skipBelow, getDocs, createTag, applyFixes)
|
||||
checkoutSource
|
||||
translations = checkoutTranslations(skipBelow) if getTranslations
|
||||
docs = checkoutDocumentation if getDocs
|
||||
|
||||
if createTag
|
||||
repositoryTags = ReleaseBuilder.repository(@app, protocol, user, @version)
|
||||
tagger = Tagger.new(@repository, repositoryTags, @app, @version)
|
||||
tagger.tagSource
|
||||
tagger.tagTranslations(translations)
|
||||
tagger.tagDocumentation(docs)
|
||||
# TODO: fix the tagger so it no longer assumes the source is always trunk
|
||||
# repositoryDest = ReleaseBuilder.repositoryRoot(@protocol, @user) + ReleaseBuilder.repositoryPath('src', @app, 'tags', @version)
|
||||
# tagger = Tagger.new(repositoryDest, @app, @version)
|
||||
# tagger.tagSource
|
||||
# tagger.tagTranslations(translations)
|
||||
# tagger.tagDocumentation(docs)
|
||||
end
|
||||
|
||||
@app.applyFixes(@workingDir, @outputDir) if applyFixes
|
||||
|
@ -61,56 +65,73 @@ public
|
|||
|
||||
def checkoutSource
|
||||
Dir.chdir @workingDir
|
||||
svnDir = "#{@app.component}/#{@app.section}/#{@app.name}"
|
||||
|
||||
repository = ReleaseBuilder.repositoryRoot(@protocol, @user) + ReleaseBuilder.repositoryPath('src', @app, @checkoutFrom, @checkoutTag)
|
||||
puts "Checking out source from #{repository} to output directory #{@outputDir}..."
|
||||
|
||||
puts "Checking out source from #{@repository}/#{svnDir}..."
|
||||
|
||||
system "svn co #{@repository}/#{svnDir} #{@outputDir} >/dev/null 2>&1"
|
||||
`svn co #{repository} #{@outputDir}`
|
||||
end
|
||||
|
||||
def checkoutTranslations(skipBelow)
|
||||
puts "checking out translations, checkoutfrom: #{@checkoutFrom}"
|
||||
Dir.chdir "#{@workingDir}/#{@outputDir}"
|
||||
|
||||
FileUtils.rm_rf 'l10n'
|
||||
FileUtils.rm_rf 'po'
|
||||
|
||||
Dir.mkdir 'l10n'
|
||||
Dir.mkdir 'po'
|
||||
repository = ReleaseBuilder.repositoryRoot(@protocol, @user) + ReleaseBuilder.repositoryPath('i18n', @app, @checkoutFrom, @checkoutTag)
|
||||
|
||||
puts "checking translations out from: #{repository}"
|
||||
|
||||
subdirs = `svn cat #{@repository}/l10n-kde4/subdirs 2>/dev/null`.chomp!
|
||||
translations = []
|
||||
|
||||
subdirs.each do |lang|
|
||||
lang.chomp!
|
||||
next if lang == 'x-test'
|
||||
if @checkoutFrom == 'trunk'
|
||||
puts "checkout from is apparently trunk"
|
||||
|
||||
FileUtils.rm_rf 'l10n'
|
||||
system "svn co #{@repository}/l10n-kde4/#{lang}/messages/#{@app.component}-#{@app.section} l10n >/dev/null 2>&1"
|
||||
next unless FileTest.exists? "l10n/#{@app.name}.po"
|
||||
Dir.mkdir 'l10n'
|
||||
Dir.mkdir 'po'
|
||||
|
||||
if skipBelow > 0
|
||||
fuzzy, untranslated, per = TranslationStatsBuilder.fileStats("l10n/#{@app.name}.po")
|
||||
puts "Language #{lang} is #{per} % complete."
|
||||
next if per < skipBelow
|
||||
end
|
||||
|
||||
puts "Adding translations for #{lang}..."
|
||||
|
||||
dest = "po/#{lang}"
|
||||
Dir.mkdir dest
|
||||
|
||||
FileUtils.mv("l10n/#{@app.name}.po", dest)
|
||||
FileUtils.mv('l10n/.svn', dest)
|
||||
subdirs = `svn cat #{repository}/subdirs 2>/dev/null`.chomp!
|
||||
|
||||
File.open("#{dest}/CMakeLists.txt", File::CREAT | File::RDWR | File::TRUNC) do |f|
|
||||
f.print <<END_OF_TEXT
|
||||
subdirs.each do |lang|
|
||||
lang.chomp!
|
||||
next if lang == 'x-test'
|
||||
|
||||
FileUtils.rm_rf 'l10n'
|
||||
`svn co #{repository}/#{lang}/messages/#{@app.component}-#{@app.section} l10n >/dev/null 2>&1`
|
||||
next unless FileTest.exists? "l10n/#{@app.name}.po"
|
||||
|
||||
if skipBelow > 0
|
||||
fuzzy, untranslated, per = TranslationStatsBuilder.fileStats("l10n/#{@app.name}.po")
|
||||
puts "Language #{lang} is #{per} % complete."
|
||||
next if per < skipBelow
|
||||
end
|
||||
|
||||
puts "Adding translations for #{lang}..."
|
||||
|
||||
dest = "po/#{lang}"
|
||||
Dir.mkdir dest
|
||||
|
||||
FileUtils.mv("l10n/#{@app.name}.po", dest)
|
||||
FileUtils.mv('l10n/.svn', dest)
|
||||
|
||||
File.open("#{dest}/CMakeLists.txt", File::CREAT | File::RDWR | File::TRUNC) do |f|
|
||||
f.print <<END_OF_TEXT
|
||||
file(GLOB _po_files *.po)
|
||||
GETTEXT_PROCESS_PO_FILES(#{lang} ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files})
|
||||
END_OF_TEXT
|
||||
end
|
||||
end
|
||||
|
||||
system "svn add #{dest}/CMakeLists.txt >/dev/null 2>&1"
|
||||
translations << lang
|
||||
`svn add #{dest}/CMakeLists.txt >/dev/null 2>&1`
|
||||
translations << lang
|
||||
end
|
||||
else
|
||||
puts "checkout from is not trunk, checking out from #{repository}"
|
||||
`svn co #{repository}`
|
||||
Dir.entries('po').sort.each do |lang|
|
||||
next if lang == 'CMakeLists.txt' or lang == '.' or lang == '..'
|
||||
translations << lang
|
||||
end
|
||||
end
|
||||
|
||||
if translations.length > 0
|
||||
|
@ -131,7 +152,7 @@ END_OF_TEXT
|
|||
|
||||
translations.each { |lang| f.print "add_subdirectory(#{lang})\n" }
|
||||
end
|
||||
|
||||
|
||||
File.open('CMakeLists.txt', File::APPEND | File::RDWR) do |f|
|
||||
f.print <<END_OF_TEXT
|
||||
include(MacroOptionalAddSubdirectory)
|
||||
|
@ -139,6 +160,7 @@ macro_optional_add_subdirectory(po)
|
|||
END_OF_TEXT
|
||||
end
|
||||
|
||||
# TODO: turn on again and check
|
||||
TranslationStatsBuilder.new(@app.name, @version, @workingDir, @outputDir).run
|
||||
else
|
||||
FileUtils.rm_rf 'po'
|
||||
|
@ -152,41 +174,55 @@ END_OF_TEXT
|
|||
def checkoutDocumentation
|
||||
Dir.chdir "#{@workingDir}/#{@outputDir}"
|
||||
|
||||
system "svn co #{@repository}/#{@app.component}/#{@app.section}/doc/#{@app.name} doc/en_US >/dev/null 2>&1"
|
||||
|
||||
if not File.exists? 'doc/en_US/index.docbook'
|
||||
FileUtils.rm_rf 'doc'
|
||||
return nil
|
||||
end
|
||||
|
||||
File.open("doc/en_US/CMakeLists.txt", File::CREAT | File::RDWR | File::TRUNC) do |f|
|
||||
f << "kde4_create_handbook(index.docbook INSTALL_DESTINATION \${HTML_INSTALL_DIR}/en_US/ SUBDIR #{@app.name})\n"
|
||||
end
|
||||
|
||||
docs = [ "en_US" ]
|
||||
repository = ReleaseBuilder.repositoryRoot(@protocol, @user) + ReleaseBuilder.repositoryPath('doc', @app, @checkoutFrom, @checkoutTag)
|
||||
|
||||
subdirs = `svn cat #{@repository}/l10n-kde4/subdirs 2>/dev/null`.chomp!
|
||||
|
||||
subdirs.each do |lang|
|
||||
lang.chomp!
|
||||
if @checkoutFrom == 'trunk'
|
||||
# the english docs are the super-extra-exception: they reside near, but not with, the code
|
||||
usDocsRepo = ReleaseBuilder.repositoryRoot(@protocol, @user) + "trunk"
|
||||
|
||||
FileUtils.rm_rf 'l10n'
|
||||
system "svn co #{@repository}/l10n-kde4/#{lang}/docs/#{@app.component}-#{@app.section}/#{@app.name} l10n >/dev/null 2>&1"
|
||||
next unless FileTest.exists? 'l10n/index.docbook'
|
||||
`svn co #{usDocsRepo}/#{@app.component}/#{@app.section}/doc/#{@app.name} doc/en_US >/dev/null 2>&1`
|
||||
|
||||
puts "Adding documentation for #{lang}..."
|
||||
|
||||
dest = "doc/#{lang}"
|
||||
FileUtils.mv('l10n', dest)
|
||||
|
||||
File.open("doc/#{lang}/CMakeLists.txt", File::CREAT | File::RDWR | File::TRUNC) do |f|
|
||||
f << "kde4_create_handbook(index.docbook INSTALL_DESTINATION \${HTML_INSTALL_DIR}/#{lang}/ SUBDIR #{@app.name})\n"
|
||||
if not File.exists? 'doc/en_US/index.docbook'
|
||||
FileUtils.rm_rf 'doc'
|
||||
return nil
|
||||
end
|
||||
|
||||
File.open("doc/en_US/CMakeLists.txt", File::CREAT | File::RDWR | File::TRUNC) do |f|
|
||||
f << "kde4_create_handbook(index.docbook INSTALL_DESTINATION \${HTML_INSTALL_DIR}/en_US/ SUBDIR #{@app.name})\n"
|
||||
end
|
||||
|
||||
system "svn add doc/#{lang}/CMakeLists.txt >/dev/null 2>&1"
|
||||
docs << lang
|
||||
end
|
||||
# now, the rest of the docs are localized, so reside somewhere else
|
||||
subdirs = `svn cat #{repository}/subdirs 2>/dev/null`.chomp!
|
||||
|
||||
subdirs.each do |lang|
|
||||
lang.chomp!
|
||||
|
||||
FileUtils.rm_rf 'l10n'
|
||||
`svn co #{repository}/#{lang}/docs/#{@app.component}-#{@app.section}/#{@app.name} l10n >/dev/null 2>&1`
|
||||
next unless FileTest.exists? 'l10n/index.docbook'
|
||||
|
||||
puts "Adding documentation for #{lang}..."
|
||||
|
||||
dest = "doc/#{lang}"
|
||||
FileUtils.mv('l10n', dest)
|
||||
|
||||
File.open("doc/#{lang}/CMakeLists.txt", File::CREAT | File::RDWR | File::TRUNC) do |f|
|
||||
f << "kde4_create_handbook(index.docbook INSTALL_DESTINATION \${HTML_INSTALL_DIR}/#{lang}/ SUBDIR #{@app.name})\n"
|
||||
end
|
||||
|
||||
`svn add doc/#{lang}/CMakeLists.txt >/dev/null 2>&1`
|
||||
docs << lang
|
||||
end
|
||||
else
|
||||
`svn co #{repository}`
|
||||
return nil if not FileTest.exists? 'doc'
|
||||
Dir.entries('doc').sort.each do |lang|
|
||||
next if lang == 'CMakeLists.txt' or lang == '.' or lang == '..'
|
||||
docs << lang
|
||||
end
|
||||
end
|
||||
|
||||
File.open('doc/CMakeLists.txt', File::CREAT | File::RDWR | File::TRUNC) do |f|
|
||||
docs.each { |lang| f << "add_subdirectory(#{lang})\n" }
|
||||
end
|
||||
|
@ -206,16 +242,15 @@ END_OF_TEXT
|
|||
|
||||
tarFileName = "#{@outputDir}.tar.bz2"
|
||||
|
||||
system "find #{@outputDir} -name .svn | xargs rm -rf"
|
||||
system "tar cfj #{tarFileName} #{@outputDir}"
|
||||
|
||||
FileUtils.rm_rf @outputDir
|
||||
`find #{@outputDir} -name .svn | xargs rm -rf`
|
||||
`tar cfj #{tarFileName} #{@outputDir}`
|
||||
`rm -rf #{@outputDir}`
|
||||
|
||||
puts "MD5: " + `md5sum #{tarFileName}`.split[0]
|
||||
puts "SHA1: " + `sha1sum #{tarFileName}`.split[0]
|
||||
end
|
||||
|
||||
def self.repository(app, protocol, user, tag)
|
||||
def self.repositoryRoot(protocol, user)
|
||||
if protocol == 'anonsvn'
|
||||
protocol = 'svn'
|
||||
user = 'anon'
|
||||
|
@ -223,16 +258,41 @@ END_OF_TEXT
|
|||
user += "@"
|
||||
end
|
||||
|
||||
if tag == 'stable'
|
||||
branch = 'branches/stable'
|
||||
elsif tag == 'trunk'
|
||||
branch = 'trunk'
|
||||
else
|
||||
branch = "tags/#{app.name}/#{tag}"
|
||||
return "#{protocol}://#{user}svn.kde.org/home/kde/"
|
||||
end
|
||||
|
||||
def self.repositoryPath(type, app, checkoutFrom, tag)
|
||||
|
||||
if type == 'src'
|
||||
|
||||
rval = case checkoutFrom
|
||||
when 'trunk' then "trunk/#{app.component}/#{app.section}/#{app.name}"
|
||||
when 'branches' then "branches/#{app.name}/#{tag}/#{app.name}"
|
||||
when 'tags' then "tags/#{app.name}/#{tag}/#{app.name}"
|
||||
else "### invalid checkout source: #{checkoutFrom} ###"
|
||||
end
|
||||
|
||||
elsif type == 'i18n'
|
||||
|
||||
rval = case checkoutFrom
|
||||
when 'trunk' then "trunk/l10n-kde4/" # followed by $lang/messages/#{app.component}-#{app.section}/#{app.name}.po, but the code has to deal with that
|
||||
when 'branches' then "branches/#{app.name}/#{tag}/po"
|
||||
when 'tags' then "tags/#{app.name}/#{tag}/po"
|
||||
else "### invalid checkout source: #{checkoutFrom} ###"
|
||||
end
|
||||
|
||||
elsif type == 'doc'
|
||||
|
||||
rval = case checkoutFrom
|
||||
when 'trunk' then "trunk/l10n-kde4/" # see above
|
||||
when 'branches' then "branches/#{app.name}/#{tag}/doc"
|
||||
when 'tags' then "tags/#{app.name}/#{tag}/doc"
|
||||
else "### invalid checkout source: #{checkoutFrom} ###"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# return "file://localhost/home/vl/tmp/svn/#{branch}"
|
||||
return "#{protocol}://#{user}svn.kde.org/home/kde/#{branch}"
|
||||
return rval
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
=begin
|
||||
***************************************************************************
|
||||
* Copyright (C) 2008 by Volker Lanz <vl@fidra.de> *
|
||||
* Copyright (C) 2008,2010 by Volker Lanz <vl@fidra.de> *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
|
@ -41,7 +41,7 @@ class ReleaseCommand
|
|||
#{$0} [options]
|
||||
where options are:
|
||||
--version (-v): mandatory
|
||||
--checkout-from (-c): trunk (default), stable, tag
|
||||
--checkout-from (-c): trunk (default), branches, tags
|
||||
--tag (-t): name of tag
|
||||
--svn-access (-s): https, svn+ssh, anonsvn (default)
|
||||
--svn-user (-u): svn username (for svn+ssh)
|
||||
|
@ -115,7 +115,7 @@ END_OF_TEXT
|
|||
return false
|
||||
end
|
||||
|
||||
if @checkoutFrom == 'tag' and @tag.empty?
|
||||
if @checkoutFrom == 'tags' and @tag.empty?
|
||||
puts 'Cannot check out from tag dir if tag is empty.'
|
||||
return false
|
||||
end
|
||||
|
@ -124,9 +124,7 @@ END_OF_TEXT
|
|||
end
|
||||
|
||||
def run(app)
|
||||
repository = ReleaseBuilder.repository(app, @protocol, @user, @checkoutFrom != 'tag' ? @checkoutFrom : @tag)
|
||||
|
||||
releaseBuilder = ReleaseBuilder.new(app, Dir.getwd, repository, @version)
|
||||
releaseBuilder.run(@protocol, @user, @createTarball, @getTranslations, @skipBelow, @getDocs, @createTag, @applyFixes)
|
||||
releaseBuilder = ReleaseBuilder.new(@checkoutFrom, @tag, app, Dir.getwd, @protocol, @user, @version)
|
||||
releaseBuilder.run(@createTarball, @getTranslations, @skipBelow, @getDocs, @createTag, @applyFixes)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/ruby
|
||||
=begin
|
||||
***************************************************************************
|
||||
* Copyright (C) 2008 by Volker Lanz <vl@fidra.de> *
|
||||
* Copyright (C) 2008,2010 by Volker Lanz <vl@fidra.de> *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
|
@ -61,14 +61,12 @@ class ReleaseDialog < Qt::Dialog
|
|||
def accept
|
||||
return if not validate
|
||||
|
||||
repository = ReleaseBuilder.repository(@app, @ui.comboAccess.currentText, @ui.editUser.text, @ui.comboCheckout.currentText != 'tag' ? @ui.comboCheckout.currentText : @ui.comboTag.currentText)
|
||||
|
||||
skipBelow = @ui.checkSkipTrans.isChecked ? @ui.spinSkipTrans.value : 0
|
||||
|
||||
hide
|
||||
|
||||
releaseBuilder = ReleaseBuilder.new(@app, Dir.getwd, repository, @ui.editVersion.text)
|
||||
releaseBuilder.run(@ui.comboAccess.currentText, @ui.editUser.text, @ui.checkTarball.isChecked, @ui.checkTranslations.isChecked, skipBelow, @ui.checkDocs.isChecked, @ui.checkTag.isChecked, @ui.checkFixes.isChecked)
|
||||
releaseBuilder = ReleaseBuilder.new(@ui.comboCheckout.currentText, @ui.comboTag.currentText, @app, Dir.getwd, @ui.comboAccess.currentText, @ui.editUser.text, @ui.editVersion.text)
|
||||
releaseBuilder.run(@ui.checkTarball.isChecked, @ui.checkTranslations.isChecked, skipBelow, @ui.checkDocs.isChecked, @ui.checkTag.isChecked, @ui.checkFixes.isChecked)
|
||||
|
||||
super
|
||||
end
|
||||
|
@ -79,8 +77,8 @@ private
|
|||
end
|
||||
|
||||
def on_comboCheckout_currentIndexChanged(index)
|
||||
@ui.comboTag.setEnabled(index == 2)
|
||||
updateTags or @ui.comboTag.setEnabled(false) if index == 2
|
||||
@ui.comboTag.clear
|
||||
@ui.comboTag.setEnabled(index == 1 && updateBranches || index == 2 && updateTags)
|
||||
end
|
||||
|
||||
def on_checkTranslations_toggled(state)
|
||||
|
@ -90,9 +88,6 @@ private
|
|||
end
|
||||
|
||||
def updateTags
|
||||
@ui.comboTag.clear
|
||||
|
||||
# tags = `svn ls file://localhost/home/vl/tmp/svn/tags/#{@app.name}`.chomp!
|
||||
tags = `svn ls svn://anonsvn.kde.org/home/kde/tags/#{@app.name}`.chomp!
|
||||
|
||||
return false if not tags or tags.length == 0
|
||||
|
@ -101,4 +96,12 @@ private
|
|||
return true
|
||||
end
|
||||
|
||||
def updateBranches
|
||||
branches = `svn ls svn://anonsvn.kde.org/home/kde/branches/#{@app.name}`.chomp!
|
||||
|
||||
return false if not branches or branches.length == 0
|
||||
|
||||
branches.sort.each { |t| @ui.comboTag.addItem(t.delete("/\n\r")) }
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
<ui version="4.0" >
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ReleaseDialog</class>
|
||||
<widget class="QDialog" name="ReleaseDialog" >
|
||||
<property name="geometry" >
|
||||
<widget class="QDialog" name="ReleaseDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
|
@ -9,70 +10,70 @@
|
|||
<height>405</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize" >
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>500</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<property name="windowTitle">
|
||||
<string>KDE Release Builder</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout" >
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="goupApplication" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||
<widget class="QGroupBox" name="goupApplication">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>1</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="title" >
|
||||
<property name="title">
|
||||
<string>Application</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="label" >
|
||||
<property name="text" >
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2" >
|
||||
<widget class="QLabel" name="label_4" >
|
||||
<property name="text" >
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>&Version:</string>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy" >
|
||||
<property name="buddy">
|
||||
<cstring>editVersion</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3" >
|
||||
<widget class="QLineEdit" name="editVersion" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
|
||||
<item row="0" column="3">
|
||||
<widget class="QLineEdit" name="editVersion">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QLabel" name="labelName" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="labelName">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
|
@ -81,139 +82,139 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>2</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="title" >
|
||||
<property name="title">
|
||||
<string>Repository and Revision</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="label_2" >
|
||||
<property name="text" >
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>&Checkout From:</string>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy" >
|
||||
<property name="buddy">
|
||||
<cstring>comboCheckout</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QComboBox" name="comboCheckout" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="comboCheckout">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<property name="text">
|
||||
<string>trunk</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>stable</string>
|
||||
<property name="text">
|
||||
<string>branches</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>tag</string>
|
||||
<property name="text">
|
||||
<string>tags</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2" >
|
||||
<widget class="QLabel" name="label_6" >
|
||||
<property name="text" >
|
||||
<string>Ta&g:</string>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Ta&g/Branch:</string>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy" >
|
||||
<property name="buddy">
|
||||
<cstring>comboCheckout</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3" >
|
||||
<widget class="QComboBox" name="comboTag" >
|
||||
<property name="enabled" >
|
||||
<item row="0" column="3">
|
||||
<widget class="QComboBox" name="comboTag">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="label_3" >
|
||||
<property name="text" >
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>&SVN Access:</string>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy" >
|
||||
<property name="buddy">
|
||||
<cstring>comboAccess</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QComboBox" name="comboAccess" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="comboAccess">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<property name="text">
|
||||
<string>anonsvn</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<property name="text">
|
||||
<string>https</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<property name="text">
|
||||
<string>svn+ssh</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2" >
|
||||
<widget class="QLabel" name="label_5" >
|
||||
<property name="text" >
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>&User:</string>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy" >
|
||||
<property name="buddy">
|
||||
<cstring>editUser</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3" >
|
||||
<widget class="QLineEdit" name="editUser" >
|
||||
<property name="enabled" >
|
||||
<item row="1" column="3">
|
||||
<widget class="QLineEdit" name="editUser">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
|
@ -224,115 +225,115 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupOptions" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||
<widget class="QGroupBox" name="groupOptions">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>2</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="title" >
|
||||
<property name="title">
|
||||
<string>Options</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QCheckBox" name="checkDocs" >
|
||||
<property name="text" >
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="checkDocs">
|
||||
<property name="text">
|
||||
<string>Get &Documentation</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QCheckBox" name="checkTranslations" >
|
||||
<property name="text" >
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="checkTranslations">
|
||||
<property name="text">
|
||||
<string>Get &Translations</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QCheckBox" name="checkTag" >
|
||||
<property name="text" >
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="checkTag">
|
||||
<property name="text">
|
||||
<string>C&reate Tag</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2" >
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" >
|
||||
<item row="3" column="0" colspan="2">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkSkipTrans" >
|
||||
<property name="text" >
|
||||
<widget class="QCheckBox" name="checkSkipTrans">
|
||||
<property name="text">
|
||||
<string>S&kip translations below completion:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSlider" name="sliderSkipTrans" >
|
||||
<property name="enabled" >
|
||||
<widget class="QSlider" name="sliderSkipTrans">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="maximum" >
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="singleStep" >
|
||||
<property name="singleStep">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="value" >
|
||||
<property name="value">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="orientation" >
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickPosition" >
|
||||
<property name="tickPosition">
|
||||
<enum>QSlider::TicksBelow</enum>
|
||||
</property>
|
||||
<property name="tickInterval" >
|
||||
<property name="tickInterval">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinSkipTrans" >
|
||||
<property name="enabled" >
|
||||
<widget class="QSpinBox" name="spinSkipTrans">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="suffix" >
|
||||
<property name="suffix">
|
||||
<string> %</string>
|
||||
</property>
|
||||
<property name="maximum" >
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="singleStep" >
|
||||
<property name="singleStep">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="value" >
|
||||
<property name="value">
|
||||
<number>50</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0" >
|
||||
<widget class="QCheckBox" name="checkTarball" >
|
||||
<property name="text" >
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="checkTarball">
|
||||
<property name="text">
|
||||
<string>Create Tar&ball</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QCheckBox" name="checkFixes" >
|
||||
<property name="text" >
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="checkFixes">
|
||||
<property name="text">
|
||||
<string>Apply &fixes</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
|
@ -341,11 +342,11 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox" >
|
||||
<property name="orientation" >
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons" >
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
|
@ -374,11 +375,11 @@
|
|||
<receiver>ReleaseDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<hint type="sourcelabel">
|
||||
<x>226</x>
|
||||
<y>447</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
|
@ -390,11 +391,11 @@
|
|||
<receiver>ReleaseDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<hint type="sourcelabel">
|
||||
<x>294</x>
|
||||
<y>447</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
|
@ -406,11 +407,11 @@
|
|||
<receiver>spinSkipTrans</receiver>
|
||||
<slot>setValue(int)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<hint type="sourcelabel">
|
||||
<x>354</x>
|
||||
<y>378</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<hint type="destinationlabel">
|
||||
<x>489</x>
|
||||
<y>383</y>
|
||||
</hint>
|
||||
|
@ -422,11 +423,11 @@
|
|||
<receiver>sliderSkipTrans</receiver>
|
||||
<slot>setValue(int)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<hint type="sourcelabel">
|
||||
<x>492</x>
|
||||
<y>397</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<hint type="destinationlabel">
|
||||
<x>342</x>
|
||||
<y>384</y>
|
||||
</hint>
|
||||
|
@ -438,11 +439,11 @@
|
|||
<receiver>sliderSkipTrans</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<hint type="sourcelabel">
|
||||
<x>123</x>
|
||||
<y>387</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<hint type="destinationlabel">
|
||||
<x>288</x>
|
||||
<y>396</y>
|
||||
</hint>
|
||||
|
@ -454,11 +455,11 @@
|
|||
<receiver>spinSkipTrans</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<hint type="sourcelabel">
|
||||
<x>87</x>
|
||||
<y>388</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<hint type="destinationlabel">
|
||||
<x>486</x>
|
||||
<y>391</y>
|
||||
</hint>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
=begin
|
||||
***************************************************************************
|
||||
* Copyright (C) 2008 by Volker Lanz <vl@fidra.de> *
|
||||
* Copyright (C) 2008,2010 by Volker Lanz <vl@fidra.de> *
|
||||
* Copyright (C) 2007-2008 by Harald Sitter <harald@getamarok.com> *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -23,6 +23,8 @@
|
|||
require 'fileutils'
|
||||
require 'application.rb'
|
||||
|
||||
# TODO: assumes the source is always trunk which is stupid
|
||||
|
||||
class Tagger
|
||||
def initialize(repositorySource, repositoryTag, app, version)
|
||||
@app = app
|
||||
|
@ -34,8 +36,8 @@ class Tagger
|
|||
|
||||
def tagSource
|
||||
puts "Tagging source files..."
|
||||
system "svn mkdir --parents -m 'Directory for tag #{@version}' #{@repositoryTag} >/dev/null 2>&1"
|
||||
system "svn cp -m 'Tag #{@version}' #{@repositorySource} #{@repositoryTag} >/dev/null 2>&1"
|
||||
`svn mkdir --parents -m 'Directory for tag #{@version}' #{@repositoryTag} >/dev/null 2>&1`
|
||||
`svn cp -m 'Tag #{@version}' #{@repositorySource} #{@repositoryTag} >/dev/null 2>&1`
|
||||
puts "Done tagging source files."
|
||||
end
|
||||
|
||||
|
@ -44,16 +46,16 @@ class Tagger
|
|||
|
||||
puts "Tagging translations..."
|
||||
|
||||
system "svn co --depth immediates #{@repositoryTag} #{@tmpDirName} >/dev/null 2>&1"
|
||||
system "svn mkdir --parents -m 'Translations for #{@version}' #{@repositoryTag}/po >/dev/null 2>&1"
|
||||
system "svn up #{@tmpDirName}/po >/dev/null 2>&1"
|
||||
`svn co --depth immediates #{@repositoryTag} #{@tmpDirName} >/dev/null 2>&1`
|
||||
`svn mkdir --parents -m 'Translations for #{@version}' #{@repositoryTag}/po >/dev/null 2>&1`
|
||||
`svn up #{@tmpDirName}/po >/dev/null 2>&1`
|
||||
|
||||
translations.each do |trans|
|
||||
system "svn mkdir #{@tmpDirName}/po/#{trans} >/dev/null 2>&1 >/dev/null 2>&1"
|
||||
system "svn cp po/#{trans}/#{@app.name}.po #{@tmpDirName}/po/#{trans}/ >/dev/null 2>&1"
|
||||
`svn mkdir #{@tmpDirName}/po/#{trans} >/dev/null 2>&1 >/dev/null 2>&1`
|
||||
`svn cp po/#{trans}/#{@app.name}.po #{@tmpDirName}/po/#{trans}/ >/dev/null 2>&1`
|
||||
end
|
||||
|
||||
system "svn ci -m 'Tag translations for #{@version}' #{@tmpDirName}/po >/dev/null 2>&1"
|
||||
`svn ci -m 'Tag translations for #{@version}' #{@tmpDirName}/po >/dev/null 2>&1`
|
||||
|
||||
FileUtils.rm_rf @tmpDirName
|
||||
|
||||
|
@ -65,13 +67,13 @@ class Tagger
|
|||
|
||||
puts "Tagging documentation..."
|
||||
|
||||
system "svn co --depth immediates #{@repositoryTag} #{@tmpDirName} >/dev/null 2>&1"
|
||||
system "svn mkdir --parents -m 'Documentation for #{@version}' #{@repositoryTag}/doc >/dev/null 2>&1"
|
||||
system "svn up #{@tmpDirName}/doc >/dev/null 2>&1"
|
||||
`svn co --depth immediates #{@repositoryTag} #{@tmpDirName} >/dev/null 2>&1`
|
||||
`svn mkdir --parents -m 'Documentation for #{@version}' #{@repositoryTag}/doc >/dev/null 2>&1`
|
||||
`svn up #{@tmpDirName}/doc >/dev/null 2>&1`
|
||||
|
||||
docs.each { |doc| system "svn cp doc/#{doc} #{@tmpDirName}/doc/ >/dev/null 2>&1" }
|
||||
docs.each { |doc| `svn cp doc/#{doc} #{@tmpDirName}/doc/ >/dev/null 2>&1` }
|
||||
|
||||
system "svn ci -m 'Tag documentation for #{@version}' #{@tmpDirName}/doc >/dev/null 2>&1"
|
||||
`svn ci -m 'Tag documentation for #{@version}' #{@tmpDirName}/doc >/dev/null 2>&1`
|
||||
|
||||
FileUtils.rm_rf @tmpDirName
|
||||
|
||||
|
|
|
@ -99,6 +99,8 @@ END_OF_TEXT
|
|||
end
|
||||
|
||||
def statsLine(file, langName, numLanguages, translatedPercent)
|
||||
return 0, 0 if not File.exists?("po/#{langName}/#{@appName}.po")
|
||||
|
||||
fuzzy, untranslated, percentage = TranslationStatsBuilder.fileStats("po/#{langName}/#{@appName}.po")
|
||||
|
||||
textColor = case percentage
|
||||
|
|
Loading…
Reference in New Issue