List<String> lines = null;
int totalLength = 0;
do {
int mesgIndex = -1, count = 0;
Executor p4 = depot.getExecFactory().newExecutor();
String debugCmd = "";
// get entire cmd to execute
String cmd[] = getExtraParams(origcmd);
// setup information for logging...
for(String cm : cmd) {
debugCmd += cm + " ";
}
// Perform execution and IO
p4.exec(cmd);
BufferedReader reader = p4.getReader();
String line = null;
totalLength = 0;
lines = new ArrayList<String>(1024);
TimedStreamCloser timedStreamCloser=null;
try
{
PerforceSCM.PerforceSCMDescriptor scmDescr = PerforceSCM.getInstance();
p4.getWriter().close();
int timeout = -1;
if(scmDescr.hasP4ReadlineTimeout()) { // Implementation with timeout
timeout = scmDescr.getP4ReadLineTimeout();
}
timedStreamCloser = new TimedStreamCloser(p4.getInputStream(), timeout);
timedStreamCloser.start();
while((line = reader.readLine()) != null) {
timedStreamCloser.reset();
// only check for errors if we have not found one already
if (mesgIndex == -1)
mesgIndex = checkAuthnErrors(line);
if(filter.reject(line)) continue;
lines.add(line);
totalLength += line.length();
count++;
}
if(timedStreamCloser.timedOut()) {
throw new PerforceException("Perforce operation timed out after " + timeout + " seconds.");
}
}
catch(IOException ioe)
{
//this is generally not anything to worry about. The underlying
//perforce process terminated and that causes java to be angry
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
ioe.printStackTrace(pw);
pw.flush();
sw.flush();
getLogger().warn("Perforce process terminated suddenly");
getLogger().warn(sw.toString());
}
finally{
if(timedStreamCloser!=null) timedStreamCloser.interrupt();
try{
p4.getWriter().close();
} catch (IOException e) {
getLogger().warn("Write pipe failed to close.");
}
try{
p4.getReader().close();
} catch (IOException e) {
getLogger().warn("Read pipe failed to close.");
}
p4.close();
}
loop = false;
// If we failed to execute because of an authentication issue, try a p4 login.
if(attemptLogin && (mesgIndex == 1 || mesgIndex == 2 || mesgIndex == 6 || mesgIndex == 9)) {
// password is unset means that perforce isn't using the environment var P4PASSWD
// Instead it is using tickets. We must attempt to login via p4 login, then
// retry this cmd.
p4.close();
trustIfSSL();
login();
loop = true;
attemptLogin = false;
continue;