[#7]: Enabled cronbuilder to save in DEST repo in multiple instances.
authorStanislaw Klekot <dozzie@jarowit.net>
Tue, 30 Aug 2011 21:17:32 +0000 (23:17 +0200)
committerStanislaw Klekot <dozzie@jarowit.net>
Fri, 2 Sep 2011 14:15:06 +0000 (16:15 +0200)
cronbuilder
lib/Cron/Builder/Repo.pm
sample-env/cronbuilder.yaml

index 224b641..c6650db 100755 (executable)
@@ -142,12 +142,14 @@ $config{build}{rebuild} = "true" if $opts{rebuild};
 
 my $src = new Cron::Builder::Repo(
   %{ $config{source} },
+  prefix   => $config{build}{prefix},
   workdir  => "source",
   statedir => "source-state",
 );
 
 my $dst = new Cron::Builder::Repo(
   %{ $config{destination} },
+  prefix   => $config{build}{prefix},
   workdir  => "dest",
   statedir => "dest-state",
 );
@@ -218,14 +220,12 @@ if ($build_status != 0) {
 my $additional_comment;
 if (defined $last_build) {
   # from oldest to newest
-  my @past_builds = reverse $src->log(since => $last_build);
+  my @past_builds = grep { not $src->is_instance_prefix($_->{short_descr}) }
+                      reverse $src->log(since => $last_build);
   if (@past_builds == 0) {
     $additional_comment = "No changes in sources.";
   } else {
-    $additional_comment =
-      join "\n",
-      map { $_->{short_descr} }
-      grep { $_->{short_descr} !~ /^\[cronbuilder\] / } @past_builds;
+    $additional_comment = join "\n", map { $_->{short_descr} } @past_builds;
   }
 } else {
   $additional_comment = "No previous build.";
index b783d98..2c01ea2 100644 (file)
@@ -68,6 +68,10 @@ URL of repository. Compare with C<workdir>.
 If repository C<url> requires authentication, this is the place to provide the
 credentials.
 
+=item C<prefix>
+
+Prefix to look for in C<build_revision()>.
+
 =back
 
 For exact list of options, see engines' documentation.
@@ -77,6 +81,10 @@ For exact list of options, see engines' documentation.
 sub new {
   my ($class, %opts) = @_;
 
+  if (not defined $opts{prefix} or $opts{prefix} eq '') {
+    $opts{prefix} = "cronbuilder";
+  }
+
   if (not defined $opts{type}) {
     die "Repository type not defined";
   }
@@ -304,7 +312,7 @@ sub build_revision {
 
   my @log = $self->log(1000); # XXX: hardcoded
 
-  my $build = first { $_->{short_descr} =~ /^\[cronbuilder\]/ } @log;
+  my $build = first { $self->is_instance_prefix($_->{short_descr}) } @log;
 
   if (not defined $build) {
     return undef;
@@ -360,7 +368,7 @@ sub build_message {
     $last_revision = "<none>"
   }
 
-  my $header = "[cronbuilder] Commited source revision $source_revision.";
+  my $header = "[$self->{prefix}] Commited source revision $source_revision.";
   my @body = (
     "build revisions:",
     "  current: $source_revision",
@@ -379,6 +387,32 @@ sub build_message {
 
 #-----------------------------------------------------------------------------
 
+=item C<is_instance_prefix($short_descr)>
+
+Method returns TRUE/FALSE to indicate that specified short commit description
+was produced by this cronbuilder instance.
+
+Arguments:
+
+=over
+
+=item C<$short_descr>
+
+Short description (first line) of commit.
+
+=back
+
+=cut
+
+sub is_instance_prefix {
+  my ($self, $shortdsc) = @_;
+
+  return substr($shortdsc, 0, length($self->{prefix}) + 2) eq
+         "[$self->{prefix}]";
+}
+
+#-----------------------------------------------------------------------------
+
 =item C<check_or_die($command, $message)>
 
 Method examines C<$?> variable and checks if recently executed external
index ccf701c..05e945b 100644 (file)
@@ -35,3 +35,8 @@ build:
   # want to be informed (building is performed rarely), and sometimes you
   # could want to omit this and only be informed about problems
   inform: true
+
+  # prefix to distinguish this cronbuilder instance from others; defaults to
+  # "cronbuilder" if empty, and no need to set this unless you want to run
+  # several cronbuilders on the same destination repository
+  #prefix: cronbuilder