Index: pom.xml =============================================================== --- pom.xml (revision 30369) +++ pom.xml (working copy) @@ -3,7 +3,7 @@ org.jvnet.hudson.plugins plugin - 1.351 + 1.382 ../pom.xml Index: src/main/java/hudson/plugins/bazaar/BazaarSCM.java =============================================================== --- src/main/java/hudson/plugins/bazaar/BazaarSCM.java (revision 30369) +++ src/main/java/hudson/plugins/bazaar/BazaarSCM.java (working copy) @@ -178,25 +178,6 @@ public class BazaarSCM extends SCM implements Serializable { return local == null ? null : new BazaarRevisionState(local); } - /** for old hudsons - delete at will **/ - @Override - public boolean pollChanges(AbstractProject project, Launcher launcher, - FilePath workspace, TaskListener listener) throws IOException, - InterruptedException { - - PrintStream output = listener.getLogger(); - - output.println("Getting upstream revision..."); - String upstream = getRevid(launcher, listener, source); - output.println(upstream); - - output.println("Getting local revision..."); - String local = getRevid(launcher, listener, workspace.getRemote()); - output.println(local); - - return ! upstream.equals(local); - } - @Override public boolean checkout(AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener, File changelogFile) throws IOException, InterruptedException { boolean canUpdate = workspace.act(new FileCallable() { @@ -209,8 +190,8 @@ public class BazaarSCM extends SCM implements Serializable { } }); - if (canUpdate && !clean) { - return update(build, launcher, workspace, listener, changelogFile); + if (canUpdate) { + return update(clean, build, launcher, workspace, listener, changelogFile); } else { return clone(build, launcher, workspace, listener, changelogFile); } @@ -219,21 +200,39 @@ public class BazaarSCM extends SCM implements Serializable { /** * Updates the current workspace. */ - private boolean update(AbstractBuild build, Launcher launcher, - FilePath workspace, BuildListener listener, File changelogFile) - throws InterruptedException, IOException { - try { - String oldid = getRevid(launcher, listener, workspace.getRemote()); + private boolean update(boolean clean, AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener, File changelogFile) throws InterruptedException, IOException { + String oldid = getRevid(launcher, listener, workspace.getRemote()); + + boolean hasProblemOccured = false; + if (clean) { + hasProblemOccured = ! branch(build, launcher, workspace, listener); + } else { + hasProblemOccured = ! pull(build, launcher, workspace, listener); + } + if (hasProblemOccured) { + return false; + } + + String newid = getRevid(launcher, listener, workspace.getRemote()); + getLog(launcher, workspace, oldid, newid, changelogFile); - if (launcher.launch().cmds(getDescriptor().getBzrExe(), "pull", "--overwrite", source) - .envs(build.getEnvironment(listener)).stdout(listener.getLogger()).pwd(workspace).join() != 0) { + return true; + } + + /** + * Pull the remote branch into workspace. + */ + private boolean pull(AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener) throws InterruptedException { + ArgumentListBuilder args = new ArgumentListBuilder(); + args.add(getDescriptor().getBzrExe(), + "pull", "--overwrite", + source); + try { + if (launcher.launch().cmds(args).envs(build.getEnvironment(listener)).stdout(listener.getLogger()).pwd(workspace).join() != 0) { listener.error("Failed to pull"); return false; } - String newid = getRevid(launcher, listener, workspace.getRemote()); - getLog(launcher, workspace, oldid, newid, changelogFile); - } catch (IOException e) { listener.error("Failed to pull"); return false; @@ -246,7 +245,19 @@ public class BazaarSCM extends SCM implements Serializable { * Start from scratch and clone the whole repository. */ private boolean clone(AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener, File changelogFile) throws InterruptedException { + if (!branch(build, launcher, workspace, listener)) { + return false; + } + + return createEmptyChangeLog(changelogFile, listener, "changelog"); + } + + /** + * Remove the workspace and branch the remote branch into a new one. + */ + private boolean branch(AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener) throws InterruptedException { try { + listener.getLogger().println("Cleaning workspace..."); workspace.deleteRecursive(); } catch (IOException e) { e.printStackTrace(listener.error("Failed to clean the workspace")); @@ -254,8 +265,9 @@ public class BazaarSCM extends SCM implements Serializable { } ArgumentListBuilder args = new ArgumentListBuilder(); - args.add(getDescriptor().getBzrExe(), "branch"); - args.add(source, workspace.getRemote()); + args.add(getDescriptor().getBzrExe(), + "branch", + source, workspace.getRemote()); try { if (launcher.launch().cmds(args).envs(build.getEnvironment(listener)).stdout(listener.getLogger()).join() != 0) { listener.error("Failed to clone " + source); @@ -265,12 +277,11 @@ public class BazaarSCM extends SCM implements Serializable { e.printStackTrace(listener.error("Failed to clone " + source)); return false; } - - return createEmptyChangeLog(changelogFile, listener, "changelog"); + return true; } @Override - public void buildEnvVars(AbstractBuild build, Map env) { + public void buildEnvVars(AbstractBuild build, Map env) { } @Override