Bug 26265: (QA follow-up) Remove g option from regex, add few dirs
[koha-equinox.git] / debian / build-git-snapshot
index e46069c..cedddae 100755 (executable)
-#!/bin/sh
+#!/usr/bin/perl 
+
+# Copyright 2010 Catalyst IT Ltd.
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# This script will build a .deb from a git snapshot of koha.
-# Don't use it for building actual versions for uploading to Debian.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# To use:
-# - commit any changes into git
-# - run this script
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+# Written by Robin Sheat <robin@catalyst.net.nz> and
+#   Srdjan Jankovic <srdjan@catalyst.net.nz>
+# Based on an sh version by Lars Wirzenius.
+
+use Modern::Perl;
+
+use Getopt::Long qw(:config no_ignore_case);
+use POSIX qw/strftime/;
+
+my $basetgz;
+my $buildresult;
+my $distribution='squeeze-dev';
+my $git_checks='all';
+my $version='16.06~git';
+my $auto_version=1;
+my $need_help;
+my $debug;
+
+GetOptions(
+    'basetgz|b=s'      => \$basetgz,
+    'buildresult|r=s'   => \$buildresult,
+    'distribution|D=s'  => \$distribution,
+    'git-checks|g=s'    => \$git_checks,
+    'version|v=s'       => \$version,
+    'autoversion!'      => \$auto_version,
+    'help|h'            => \$need_help,
+    'debug|d'           => \$debug,
+);
+
+help_and_exit() if $need_help;
+
+
+sub sys_command_output {
+    my ($command) = @_;
 
-set -e
+    print "$command\n" if $debug;
+    my $command_output;
+    open($command_output, "-|", "$command ")
+      or die qq{Cannot execute "$command": $!"};
+    return map { chomp; $_ } <$command_output>;
+}
+
+sub sys_command_output_screen {
+    my ($command) = @_;
 
-die()
-{
-    echo "$@"
-    exit 1
+    print "$command\n" if $debug;
+    system($command) == 0 or die "Command '$command' returns an error ($?)\n";
 }
 
-everything_is_commited()
-{
-    if git status --short | grep -q '^'
-    then
-        return 1
-    else
-        return 0
-    fi
+sub everything_is_committed {
+    my $filter;
+    for ($git_checks) {
+        $_ eq "none"
+          and return 1;
+
+        $_ eq "modified"
+          and $filter = "no",
+              last;
+
+        $_ eq "all"
+          and $filter = "normal",
+              last;
+
+           help_and_exit("$0: --git-checks/-g must be one of 'all', 'modified', or 'none'");
+    }
+    my $has_changes = grep /^xxx/, sys_command_output("git status --porcelain -u${filter}");
+
+    return !$has_changes;
 }
 
-latest_sha1() {
-    git rev-parse --short=8 HEAD
+sub help_and_exit {
+       my $msg = shift;
+       if ($msg) {
+       print "$msg\n\n";
+    }
+    print <<EOH;
+This builds Koha deb packages, from a git snapshot. It's not suitable for
+making upstreamable verions, but handy for your own local packages.
+
+Options:
+    --buildresult, -r
+        the location that the resulting .deb, .changes, etc. will be placed in.
+        Default is whatever pdebuild uses.
+    --distribution, -D
+        the distribution value to set in the changelog when editing it. Default
+        is 'squeeze-dev'.
+    --git-checks, -g
+        what level of git checks are run to determine if the working copy is
+        clean enough. One of 'all' (any changes are bad), 'modified' (only
+        tracked files with untracked changes will cause an error), and 'none'
+        (checking git status is skipped totally.) Default is 'all'.
+    --version, -v
+        the version string for the resulting package. Default is '$version'.
+    --(no)autoversion
+        whether or not to use the date and git commit ID in the version value.
+        Default is to include it.
+    --debug, -d
+EOH
+    exit;
 }
 
-newversion() {
-    printf '3.2~git%s.%s' $(date +%Y%m%d%H%M%S) $(latest_sha1)
+sub latest_sha1 {
+    return sys_command_output("git rev-parse --short=8 HEAD");
 }
 
-adjust_debian_changelog() {
-    dch --force-distribution -D squeeze-dev -v "$1" \
-        "Building git snapshot."
-    dch -r "Building git snapshot."
+sub adjust_debian_changelog {
+    my ($newversion) = @_;
+    # debian revision
+    $newversion .= "-1";
+
+    sys_command_output( qq{dch --force-distribution -D "$distribution" -v "$newversion" "Building git snapshot."} );
+    sys_command_output( qq{dch -r "Building git snapshot."} );
 }
 
-reset_debian_changelog() {
-    git checkout -- debian/changelog
+sub reset_debian_changelog {
+    sys_command_output( qq{git checkout -- debian/changelog} );
 }
 
-build_package() {
-    git archive --format=tar --prefix="koha-$1/" HEAD | 
-        gzip -9 > "../koha_$1.tar.gz"
-    debuild -us -uc
+sub build_package {
+    my ($newversion) = @_;
+    sys_command_output( qq{git archive --format=tar --prefix="koha-$newversion/" HEAD | gzip -9 > "../koha_$newversion.orig.tar.gz"} );
+
+    my $pdebuildopts = $buildresult ? "--buildresult $buildresult" : "";
+    my $pdebuildbasetgz = $basetgz ? "-- --basetgz /var/cache/pbuilder/" . $basetgz . ".tgz" : "";
+    sys_command_output_screen( "pdebuild $pdebuildbasetgz $pdebuildopts" );
 }
 
-if ! everything_is_commited
-then
-    die "cannot build: uncommited changes"
-fi
+everything_is_committed() or die "cannot build: uncommited changes";
+
+my $newversion = $auto_version
+  ? sprintf ('%s%s.%s', $version, strftime("+%Y%m%d%H%M%S", localtime), latest_sha1())
+  : $version;
+
+adjust_debian_changelog( $newversion );
+build_package( $newversion );
+reset_debian_changelog();
 
-version="$(newversion)"
-adjust_debian_changelog "$version"
-build_package "$version"
-reset_debian_changelog