package hudson.plugins.accurev.cmd;
import hudson.EnvVars;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.TaskListener;
import hudson.plugins.accurev.AccurevLauncher;
import hudson.plugins.accurev.AccurevSCM;
import hudson.plugins.accurev.XmlParserFactory;
import hudson.plugins.accurev.parsers.output.ParseOutputToFile;
import hudson.plugins.accurev.parsers.xml.ParseUpdate;
import hudson.util.ArgumentListBuilder;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.logging.Logger;
/**
* @author raymond
*/
public class Update extends Command {
private static final Logger logger = Logger.getLogger(Update.class.getName());
private static final String FFPSCM_DELIM = ",";
private static ArgumentListBuilder createCommand(final AccurevSCM.AccurevServer server, //
final boolean preview,
final String reftree,
final boolean minus9) {
final ArgumentListBuilder cmd = new ArgumentListBuilder();
cmd.add("update");
addServer(cmd, server);
cmd.add("-fx");
if (reftree != null) {
cmd.add("-r");
cmd.add(reftree);
}
if (minus9) {
cmd.add("-9");
}
if (preview) {
cmd.add("-i");
}
return cmd;
}
public static Boolean hasChanges(AccurevSCM scm, //
AccurevSCM.AccurevServer server, //
EnvVars accurevEnv, //
FilePath workspace, //
TaskListener listener, //
Launcher launcher, //
String reftree) throws IOException {
List<String> files = new ArrayList<>();
final ArgumentListBuilder cmd = createCommand(server, true, reftree, false);
XmlPullParserFactory parser = XmlParserFactory.getFactory();
if (parser == null) throw new IOException("No XML Parser");
Boolean transactionFound = AccurevLauncher.runCommand("Update command", scm.getAccurevTool(), launcher, cmd, scm.getOptionalLock(), accurevEnv, workspace, listener,
logger, parser, new ParseUpdate(), files);
if (transactionFound != null && transactionFound) {
String filterForPollSCM = scm.getFilterForPollSCM();
String subPath = scm.getSubPath();
Collection<String> filterPaths = null;
String filterList = null;
if (filterForPollSCM != null && !(filterForPollSCM.isEmpty())) {
filterList = filterForPollSCM;
} else if (subPath != null && !(subPath.isEmpty())) {
filterList = subPath;
}
if (filterList != null && !filterList.isEmpty()) {
filterList = filterList.replace(", ", ",");
filterPaths = new ArrayList<>(Arrays.asList(filterList.split(FFPSCM_DELIM)));
}
if (filterPaths != null) {
transactionFound = false;
for (String Filter_For_Poll_SCM1 : filterPaths) {
for (String file : files) {
if (file.contains(Filter_For_Poll_SCM1)) {
transactionFound = true;
break;
}
}
if (transactionFound) {
break;
}
}
}
} else {
return false;
}
return transactionFound;
}
public static boolean performUpdate(final AccurevSCM scm, //
final AccurevSCM.AccurevServer server, //
final EnvVars accurevEnv, //
final FilePath workspace, //
final TaskListener listener, //
final Launcher launcher, //
final String reftree,
File changelogFile) throws IOException {
final ArgumentListBuilder cmd = createCommand(server, false, reftree, false);
final Boolean result = AccurevLauncher.runCommand("Update command", scm.getAccurevTool(), launcher,
cmd, scm.getOptionalLock(), accurevEnv, workspace, listener,
logger, new ParseOutputToFile(), changelogFile);
if (result == null) return false;
return result;
}
}