#!/usr/bin/perl # Packager Utility for Gekko # use strict; use Getopt::Long; my ($gekko_src, $pkg_output, $devel_src, $pkg_ext); $gekko_src = "../src"; $devel_src = ".."; $pkg_output= "/tmp/gekko"; $pkg_ext = "tgz"; my ($opt_help, $opt_release, $opt_package, $opt_force, $opt_module, $opt_template, $opt_style, $opt_iconset, $opt_language, $opt_pkg_version, $opt_use_tpl, $opt_smileys, $opt_complete, $opt_doc, $opt_blog); GetOptions ( 'help' => \$opt_help, 'release' => \$opt_release, 'package' => \$opt_package, 'module' => \$opt_module, 'template' => \$opt_template, 'style' => \$opt_style, 'language' => \$opt_language, 'iconset' => \$opt_iconset, 'smileys' => \$opt_smileys, 'pkg-version=s' => \$opt_pkg_version, 'use-tpl=s' => \$opt_use_tpl, 'complete' => \$opt_complete, 'blog' => \$opt_blog, 'doc' => \$opt_doc, 'force' => \$opt_force ); if ($opt_help || (!$opt_release && !$opt_module && !$opt_template && !$opt_iconset && !$opt_style && !$opt_language && !$opt_smileys && !$opt_doc)) { exit(usage()); } system("mkdir -p releases"); if ($opt_release) { if ($opt_doc) { system("$0 --doc"); } my @core_modules = ("admin", "blocks", "conf", "groups", "menu-editor", "modules", "packages", "users"); my ($pkg_ver); $pkg_ver = shift(@ARGV) || exit(usage()); my $pkg_name = "gekko-$pkg_ver"; my $ver_err = 0; # verifying main version open (MAIN_VER, "grep \"\\\"GEKKO_VERSION\\\"\" $gekko_src/conf.php |"); my ($soft_ver) = ( =~ /\"([0-9.]*)\"/); if ($soft_ver ne $pkg_ver) { print "$0: Warning: Provided version ($pkg_ver) and software version ($soft_ver) doesn't match!\n"; $ver_err = 1; } close(MAIN_VER); # when errors ocurred if ($ver_err && !$opt_force) { force_msg() } # cleaning destination directory clean_dest($pkg_output .= "/$pkg_name"); # copying gekko system("rsync -aC $gekko_src $pkg_output"); system("cd $devel_src && rsync -aC AUTHORS COPYING INSTALL LICENSE README THANKS TODO doc utils $pkg_output"); system("cd $pkg_output && rm -rf src/temp/* src/data/* utils/releases/*"); system("cd $pkg_output && find . | grep \.svn | xargs rm -rf"); # cleaning dbconf.php system("> $pkg_output/src/dbconf.php"); # removing non-core modules open(MOD_LIST, "ls $pkg_output/src/modules |"); while (my $mod_name = ) { ($mod_name) = ($mod_name =~ /([a-zA-Z0-9\.\-_]*)/); my $found = 0; for (my $i = 0; $i < @core_modules && !$found; $i++) { if ($mod_name eq $core_modules[$i]) { $found = 1; } } if (!$found && $mod_name ne "index.html") { system("$0 --module $mod_name"); system("rm -rf $pkg_output/src/modules/$mod_name"); system("rm -rf $pkg_output/src/templates/default/$mod_name"); system("rm -rf $pkg_output/src/media/icons/default/48/$mod_name*"); system("rm -rf $pkg_output/src/media/icons/default/16/$mod_name*"); } } close(MOD_LIST); # removing non-default templates, styles & iconsets # > templates open(TPL_LIST, "ls -1 $pkg_output/src/templates |"); while (my $tpl_name = ) { ($tpl_name) = ($tpl_name =~ /([a-zA-Z0-9\.\-_]*)/); if ($tpl_name ne "default" && $tpl_name ne "index.html") { system("rm -rf $pkg_output/src/templates/$tpl_name"); } } close(TPL_LIST); # > styles open (TPL_DIR, "ls -1 $pkg_output/src/templates/default/*.css |"); while (my $css = ) { ($css) = ($css =~ /^*([a-zA-Z0-9\-\._]*)\.css$/); if ($css ne "default") { system("rm $pkg_output/src/templates/default/$css.css"); system("rm -rf $pkg_output/src/templates/default/css/$css"); } } close(TPL_DIR); # > iconset open (ICON_DIR, "ls -1 $pkg_output/src/media/icons |"); while (my $iconset = ) { ($iconset) = ($iconset =~ /([a-zA-Z0-9\.\-_]*)/); if ($iconset ne "default") { system("rm -rf $pkg_output/src/media/icons/$iconset"); } } close(ICON_DIR); # > smileys open (SMILEYS_DIR, "ls -1 $pkg_output/src/media/smileys |"); while (my $smileys = ) { ($smileys) = ($smileys =~ /([a-zA-Z0-9\.\-_]*)/); if ($smileys ne "default") { system("rm -rf $pkg_output/src/media/smileys/$smileys"); } } close(SMILEYS_DIR); # compressing system("cd $pkg_output/.. && tar -czf $pkg_name.tar.gz $pkg_name"); system("mv $pkg_output.tar.gz ./releases"); system("md5sum ./releases/$pkg_name.tar.gz"); system("rm -rf $pkg_output"); if ($opt_complete) { system("cd ./releases && tar xzf $pkg_name.tar.gz && mv $pkg_name gekko-complete-$pkg_ver && for i in *.tgz; do tar xzf \$i -C gekko-complete-$pkg_ver/src; done"); system("cd ./releases && tar czf gekko-complete-$pkg_ver.tar.gz gekko-complete-$pkg_ver && rm -rf gekko-complete-$pkg_ver"); system("md5sum ./releases/gekko-complete-$pkg_ver.tar.gz"); } if ($opt_blog) { my $blog_modules = "backup categories blog comments contact gallery statistics extensions pages"; system("cd ./releases && tar xzf $pkg_name.tar.gz && mv $pkg_name gekko-blog-$pkg_ver && for i in $blog_modules; do tar xzf \$i-*.module.tgz -C gekko-blog-$pkg_ver/src; done"); system("cd ./releases && tar czf gekko-blog-$pkg_ver.tar.gz gekko-blog-$pkg_ver && rm -rf gekko-blog-$pkg_ver"); system("md5sum ./releases/gekko-blog-$pkg_ver.tar.gz"); } } elsif ($opt_doc) { system("cd ../doc && make"); } elsif ($opt_module) { my ($mod_name); $mod_name = shift(@ARGV) || exit(usage()); # getting version open (MOD_VER, "grep \"[0-9\.]*<\/version>\" $gekko_src/modules/$mod_name/package.xml |"); my ($mod_ver) = ( =~ /([0-9\.]*)<\/version>/); my $pkg_name = "$mod_name-$mod_ver.module"; close(MOD_VER); clean_dest($pkg_output .= "/$pkg_name"); # creating package structure system("mkdir -p $pkg_output/modules"); system("mkdir -p $pkg_output/templates/default"); system("mkdir -p $pkg_output/media/icons/default/48"); system("mkdir -p $pkg_output/media/icons/default/16"); # copying package files system("rsync -aC $gekko_src/modules/$mod_name $pkg_output/modules"); system("rsync -aC $gekko_src/templates/default/$mod_name $pkg_output/templates/default"); system("rsync -aC $gekko_src/media/icons/default/48/$mod_name* $pkg_output/media/icons/default/48"); system("rsync -aC $gekko_src/media/icons/default/16/$mod_name* $pkg_output/media/icons/default/16"); # compressing package pkg_compress($pkg_output, $pkg_name); } elsif ($opt_template) { my $tpl_name = shift(@ARGV) || exit(usage()); my $pkg_ver = $opt_pkg_version || exit(usage()); my $pkg_name = "$tpl_name-$pkg_ver.template"; clean_dest($pkg_output .= "/$pkg_name"); # creating package structure system("mkdir -p $pkg_output/templates"); # copying package files system("rsync -aC $gekko_src/templates/$tpl_name $pkg_output/templates"); pkg_compress($pkg_output, $pkg_name); } elsif ($opt_style) { my $css_name = shift(@ARGV) || exit(usage()); my $pkg_ver = $opt_pkg_version || exit(usage()); my $tpl_name = $opt_use_tpl || "default"; my $pkg_name = "$css_name-$pkg_ver.style"; clean_dest($pkg_output .= "/$pkg_name"); # package structure system("mkdir -p $pkg_output/templates/$tpl_name/css"); # copying package files system("rsync -aC $gekko_src/templates/$tpl_name/$css_name.css $pkg_output/templates/$tpl_name"); system("rsync -aC $gekko_src/templates/$tpl_name/css/$css_name $pkg_output/templates/$tpl_name/css"); pkg_compress($pkg_output, $pkg_name); } elsif ($opt_iconset) { my $iconset = shift(@ARGV) || exit(usage()); my $pkg_ver = $opt_pkg_version || exit(usage()); my $pkg_name = "$iconset-$pkg_ver.iconset"; clean_dest($pkg_output .= "./$pkg_name"); # package structure system("mkdir -p $pkg_output/media/icons"); # copying package files system("rsync -aC $gekko_src/media/icons/$iconset $pkg_output/media/icons"); pkg_compress($pkg_output, $pkg_name); } elsif ($opt_smileys) { my $smileys = shift(@ARGV) || exit(usage()); my $pkg_ver = $opt_pkg_version || exit(usage()); my $pkg_name = "$smileys-$pkg_ver.smileys"; clean_dest($pkg_output .= "./$pkg_name"); # package structure system("mkdir -p $pkg_output/media/smileys"); # copying package files system("rsync -aC $gekko_src/media/smileys/$smileys $pkg_output/media/smileys"); pkg_compress($pkg_output, $pkg_name); } elsif ($opt_language) { my $lang = shift(@ARGV) || exit usage(); my $pkg_ver = $opt_pkg_version || exit(usage()); my $pkg_name = "$lang-$pkg_ver.lang"; clean_dest($pkg_output .= "./$pkg_name"); # package strcuture system("mkdir -p $pkg_output/modules"); system("mkdir -p $pkg_output/lang"); # module language files open (MODULES, "ls $gekko_src/modules |"); while (my $mod_name = ) { ($mod_name) = ($mod_name =~ /([a-zA-Z0-9\.\-_]*)/); if ( -d "$gekko_src/modules/$mod_name/lang/$lang") { system("mkdir -p $pkg_output/modules/$mod_name/lang"); system("rsync -aC $gekko_src/modules/$mod_name/lang/$lang $pkg_output/modules/$mod_name/lang"); } } close(MODULES); system ("rsync -aC $gekko_src/lang/es $pkg_output/lang"); # packaging pkg_compress($pkg_output, $pkg_name); } sub pkg_compress() { my $workdir = shift; my $filenam = shift; system("cd $workdir && find . | grep \.svn | xargs rm -rf"); system("cd $workdir && tar -czf ../$filenam.$pkg_ext *"); system("mv $workdir.$pkg_ext ./releases"); system("md5sum ./releases/$filenam.$pkg_ext"); system("rm -rf $workdir"); } sub clean_dest() { my $dest = shift; system("rm -rf $dest"); system("mkdir -p $dest"); } sub force_msg() { printf "Use --force to override.\n"; exit; } sub usage() { printf("Makes a ready-to-distribute Gekko package\n"); printf("Usage: $0 [COMMAND] [PACKAGE]\n\n"); printf("Commands:\n"); printf("\t--help (this screen)\n"); printf("\t--release [version] [--complete]\n"); printf("\t--module [name]\n"); printf("\t--template [name] --pkg-version=[template version]\n"); printf("\t--style [name] --pkg-version=[style version] [--use-tpl=[template]]\n"); printf("\t--language [name] --pkg-version=[language version]\n"); printf("\t--iconset [name] --pkg-version=[iconset version]\n"); printf("\t--smileys [name] --pkg-version=[smileys version]\n"); printf("\t--doc\n"); }