Package: sbuild
Version: 0.59.1-1
Severity: wishlist
Tags: patch

Currently a cloned schroot is always purged, which makes debugging build failures impossible. The attached patch keeps the session, if PURGE_BUILD_DIRECTORY or PURGE_BUILD_DEPS is set to 'successful' and the build failes.

The attached patch is against current git HEAD 361d275e9bf200f3bdacd78b7ecf267847d20a18

Jan-Marek Glogowski
commit e39bf2f5ab939304524347042c01d3a87fccf7ef
Author: Jan-Marek Glogowski <glo...@fbihome.de>
Date:   Mon Jan 18 10:31:54 2010 +0100

    Don't always purge cloned session
    
    If PURGE_BUILD_DIRECTORY or PURGE_BUILD_DEPS is set to 'successful'
    and the build fails, keep the cloned session for inspection and
    mention the session id to use "schroot -c <id> -e" to close the
    session.

diff --git a/lib/Sbuild/Build.pm b/lib/Sbuild/Build.pm
index 2cb5b4a..cccdce2 100644
--- a/lib/Sbuild/Build.pm
+++ b/lib/Sbuild/Build.pm
@@ -229,6 +229,7 @@ sub run {
 	$chroot_info = Sbuild::ChrootInfoSudo->new($self->get('Config'));
     }
 
+    my $end_session = 1;
     my $session = $chroot_info->create($self->get_conf('DISTRIBUTION'),
 				       $self->get_conf('CHROOT'),
 				       $self->get_conf('ARCH'));
@@ -392,37 +393,52 @@ sub run {
     }
 
   cleanup_packages:
-    # Purge package build directory
-    if ($self->get_conf('PURGE_BUILD_DIRECTORY') eq 'always' ||
-	($self->get_conf('PURGE_BUILD_DIRECTORY') eq 'successful' &&
-	 $self->get_status() eq 'successful')) {
-	$self->log("Purging " . $self->get('Chroot Build Dir') . "\n");
-	my $bdir = $self->get('Session')->strip_chroot_path($self->get('Chroot Build Dir'));
-	$self->get('Session')->run_command(
-	    { COMMAND => ['rm', '-rf', $bdir],
-	      USER => 'root',
-	      CHROOT => 1,
-	      PRIORITY => 0,
-	      DIR => '/' });
-    }
-
-    # Purge installed packages
-    if (defined ($session->get('Session Purged')) &&
-	$session->get('Session Purged') == 1) {
-	$self->log("Not removing build depends: cloned chroot in use\n");
+    my $purge_build_directory = 
+	($self->get_conf('PURGE_BUILD_DIRECTORY') eq 'always' ||
+	 ($self->get_conf('PURGE_BUILD_DIRECTORY') eq 'successful' &&
+	  $self->get_status() eq 'successful')) ? 1 : 0;
+    my $purge_build_deps = 
+	($self->get_conf('PURGE_BUILD_DEPS') eq 'always' ||
+	 ($self->get_conf('PURGE_BUILD_DEPS') eq 'successful' &&
+	  $self->get_status() eq 'successful')) ? 1 : 0;
+    my $is_cloned_session = (defined ($session->get('Session Purged')) &&
+        $session->get('Session Purged') == 1) ? 1 : 0;
+
+    # Purge non-cloned session
+    if ($is_cloned_session) {
+	$self->log("Not cleaning session: cloned chroot in use\n");
+	$end_session = 0
+	    if ($purge_build_directory == 0 || $purge_build_deps == 0);
     } else {
-	if ($self->get_conf('PURGE_BUILD_DEPS') eq 'always' ||
-	    ($self->get_conf('PURGE_BUILD_DEPS') eq 'successful' &&
-	     $self->get_status() eq 'successful')) {
+	if ($purge_build_directory) {
+	    # Purge package build directory
+	    $self->log("Purging " . $self->get('Chroot Build Dir') . "\n");
+	    my $bdir = $self->get('Session')->strip_chroot_path($self->get('Chroot Build Dir'));
+	    $self->get('Session')->run_command(
+		{ COMMAND => ['rm', '-rf', $bdir],
+		  USER => 'root',
+		  CHROOT => 1,
+		  PRIORITY => 0,
+		  DIR => '/' });
+	}
+
+	if ($purge_build_deps) {
+	    # Removing dependencies
 	    $self->get('Dependency Resolver') && $self->get('Dependency Resolver')->uninstall_deps();
 	} else {
 	    $self->log("Not removing build depends: as requested\n");
 	}
     }
     $self->get('Dependency Resolver') && $self->get('Dependency Resolver')->remove_srcdep_lock_file();
+
   cleanup_close:
-    # End chroot session
-    $session->end_session();
+    if ($end_session == 1) {
+	# End chroot session
+	$session->end_session();
+    }
+    else {
+	$self->log("Keeping session: " . $session->get('Session ID') . "\n");
+    }
     $session = undef;
     $self->set('Session', $session);
 

Reply via email to