View | Details | Raw Unified | Return to bug 50181
Collapse All | Expand All

(-)src/main/org/apache/tools/ant/taskdefs/Execute.java (-2 / +6 lines)
Lines 32-37 Link Here
32
import java.util.Vector;
32
import java.util.Vector;
33
33
34
import org.apache.tools.ant.BuildException;
34
import org.apache.tools.ant.BuildException;
35
import org.apache.tools.ant.ExecutedProgramFailedException;
35
import org.apache.tools.ant.MagicNames;
36
import org.apache.tools.ant.MagicNames;
36
import org.apache.tools.ant.Project;
37
import org.apache.tools.ant.Project;
37
import org.apache.tools.ant.Task;
38
import org.apache.tools.ant.Task;
Lines 691-698 Link Here
691
            exe.setCommandline(cmdline);
692
            exe.setCommandline(cmdline);
692
            int retval = exe.execute();
693
            int retval = exe.execute();
693
            if (isFailure(retval)) {
694
            if (isFailure(retval)) {
694
                throw new BuildException(cmdline[0]
695
                throw new ExecutedProgramFailedException(cmdline[0]
695
                    + " failed with return code " + retval, task.getLocation());
696
                    + " failed with return code " + retval,
697
                        task.getLocation(),
698
                        retval,
699
                        cmdline[0]);
696
            }
700
            }
697
        } catch (java.io.IOException exc) {
701
        } catch (java.io.IOException exc) {
698
            throw new BuildException("Could not launch " + cmdline[0] + ": "
702
            throw new BuildException("Could not launch " + cmdline[0] + ": "
(-)src/main/org/apache/tools/ant/TimeoutException.java (+111 lines)
Line 0 Link Here
1
/*
2
 *  Licensed to the Apache Software Foundation (ASF) under one or more
3
 *  contributor license agreements.  See the NOTICE file distributed with
4
 *  this work for additional information regarding copyright ownership.
5
 *  The ASF licenses this file to You under the Apache License, Version 2.0
6
 *  (the "License"); you may not use this file except in compliance with
7
 *  the License.  You may obtain a copy of the License at
8
 *
9
 *      http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 *  Unless required by applicable law or agreed to in writing, software
12
 *  distributed under the License is distributed on an "AS IS" BASIS,
13
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 *  See the License for the specific language governing permissions and
15
 *  limitations under the License.
16
 *
17
 */
18
19
package org.apache.tools.ant;
20
21
/**
22
 *
23
 * This exception is used to indicate timeouts.
24
 * @since Ant1.8.2
25
 *
26
 */
27
28
public class TimeoutException extends BuildException {
29
    
30
    private static final long serialVersionUID = 6640770770240792003L;
31
32
    /**
33
     * Constructs a build exception with no descriptive information.
34
     */
35
    public TimeoutException() {
36
    }
37
38
    /**
39
     * Constructs an exception with the given descriptive message.
40
     *
41
     * @param message A description of or information about the exception.
42
     *            Should not be <code>null</code>.
43
     */
44
    public TimeoutException(String message) {
45
        super(message);
46
    }
47
48
    /**
49
     * Constructs an exception with the given message and exception as
50
     * a root cause.
51
     *
52
     * @param message A description of or information about the exception.
53
     *            Should not be <code>null</code> unless a cause is specified.
54
     * @param cause The exception that might have caused this one.
55
     *              May be <code>null</code>.
56
     */
57
    public TimeoutException(String message, Throwable cause) {
58
        super(message, cause);
59
    }
60
61
    /**
62
     * Constructs an exception with the given message and exception as
63
     * a root cause and a location in a file.
64
     *
65
     * @param msg A description of or information about the exception.
66
     *            Should not be <code>null</code> unless a cause is specified.
67
     * @param cause The exception that might have caused this one.
68
     *              May be <code>null</code>.
69
     * @param location The location in the project file where the error
70
     *                 occurred. Must not be <code>null</code>.
71
     */
72
    public TimeoutException(String msg, Throwable cause, Location location) {
73
        super(msg, cause, location);
74
    }
75
76
    /**
77
     * Constructs an exception with the given exception as a root cause.
78
     *
79
     * @param cause The exception that might have caused this one.
80
     *              Should not be <code>null</code>.
81
     */
82
    public TimeoutException(Throwable cause) {
83
        super(cause);
84
    }
85
86
    /**
87
     * Constructs an exception with the given descriptive message and a
88
     * location in a file.
89
     *
90
     * @param message A description of or information about the exception.
91
     *            Should not be <code>null</code>.
92
     * @param location The location in the project file where the error
93
     *                 occurred. Must not be <code>null</code>.
94
     */
95
    public TimeoutException(String message, Location location) {
96
        super(message, location);
97
    }
98
99
    /**
100
     * Constructs an exception with the given exception as
101
     * a root cause and a location in a file.
102
     *
103
     * @param cause The exception that might have caused this one.
104
     *              Should not be <code>null</code>.
105
     * @param location The location in the project file where the error
106
     *                 occurred. Must not be <code>null</code>.
107
     */
108
    public TimeoutException(Throwable cause, Location location) {
109
        super(cause, location);
110
    }
111
}
(-)src/main/org/apache/tools/ant/taskdefs/optional/javah/Gcjh.java (-7 / +8 lines)
Lines 18-23 Link Here
18
package org.apache.tools.ant.taskdefs.optional.javah;
18
package org.apache.tools.ant.taskdefs.optional.javah;
19
19
20
import org.apache.tools.ant.BuildException;
20
import org.apache.tools.ant.BuildException;
21
import org.apache.tools.ant.ExecutedProgramFailedException;
21
import org.apache.tools.ant.taskdefs.Execute;
22
import org.apache.tools.ant.taskdefs.Execute;
22
import org.apache.tools.ant.taskdefs.optional.Javah;
23
import org.apache.tools.ant.taskdefs.optional.Javah;
23
import org.apache.tools.ant.types.Commandline;
24
import org.apache.tools.ant.types.Commandline;
Lines 35-53 Link Here
35
36
36
    /**
37
    /**
37
     * Performs the actual compilation.
38
     * Performs the actual compilation.
39
     * @param javah the calling javah task.
40
     * @return true if the compilation was successful.
41
     * @throws BuildException if there is an error other than the executed program signalling a failure.
38
     */
42
     */
39
    public boolean compile(Javah javah) throws BuildException {
43
    public boolean compile(Javah javah) throws BuildException {
40
        Commandline cmd = setupGcjhCommand(javah);
44
        Commandline cmd = setupGcjhCommand(javah);
41
        try {
45
        try {
42
            Execute.runCommand(javah, cmd.getCommandline());
46
            Execute.runCommand(javah, cmd.getCommandline());
43
            return true;
47
            return true;
44
        } catch (BuildException e) {
48
        } catch (ExecutedProgramFailedException execFailed) {
45
            if (e.getMessage().indexOf("failed with return code") == -1) {
46
                throw e;
47
            }
48
        }
49
        return false;
49
            return false;
50
    }
50
        }
51
    }
51
52
52
    private Commandline setupGcjhCommand(Javah javah) {
53
    private Commandline setupGcjhCommand(Javah javah) {
53
        Commandline cmd = new Commandline();
54
        Commandline cmd = new Commandline();
(-)src/main/org/apache/tools/ant/taskdefs/optional/javah/Kaffeh.java (-8 / +6 lines)
Lines 18-23 Link Here
18
package org.apache.tools.ant.taskdefs.optional.javah;
18
package org.apache.tools.ant.taskdefs.optional.javah;
19
19
20
import org.apache.tools.ant.BuildException;
20
import org.apache.tools.ant.BuildException;
21
import org.apache.tools.ant.ExecutedProgramFailedException;
21
import org.apache.tools.ant.taskdefs.Execute;
22
import org.apache.tools.ant.taskdefs.Execute;
22
import org.apache.tools.ant.taskdefs.optional.Javah;
23
import org.apache.tools.ant.taskdefs.optional.Javah;
23
import org.apache.tools.ant.types.Commandline;
24
import org.apache.tools.ant.types.Commandline;
Lines 38-44 Link Here
38
     * Performs the actual compilation.
39
     * Performs the actual compilation.
39
     * @param javah the calling javah task.
40
     * @param javah the calling javah task.
40
     * @return true if the compilation was successful.
41
     * @return true if the compilation was successful.
41
     * @throws BuildException if there is an error.
42
     * @throws BuildException if there is an error other than the executed program signalling a failure.
42
     * @since Ant 1.6.3
43
     * @since Ant 1.6.3
43
     */
44
     */
44
    public boolean compile(Javah javah) throws BuildException {
45
    public boolean compile(Javah javah) throws BuildException {
Lines 46-58 Link Here
46
        try {
47
        try {
47
            Execute.runCommand(javah, cmd.getCommandline());
48
            Execute.runCommand(javah, cmd.getCommandline());
48
            return true;
49
            return true;
49
        } catch (BuildException e) {
50
        } catch (ExecutedProgramFailedException execFailed) {
50
            if (e.getMessage().indexOf("failed with return code") == -1) {
51
                throw e;
52
            }
53
        }
54
        return false;
51
            return false;
55
    }
52
        }
53
    }
56
54
57
    private Commandline setupKaffehCommand(Javah javah) {
55
    private Commandline setupKaffehCommand(Javah javah) {
58
        Commandline cmd = new Commandline();
56
        Commandline cmd = new Commandline();
(-)src/main/org/apache/tools/ant/taskdefs/optional/testing/BlockFor.java (-4 / +4 lines)
Lines 17-22 Link Here
17
 */
17
 */
18
package org.apache.tools.ant.taskdefs.optional.testing;
18
package org.apache.tools.ant.taskdefs.optional.testing;
19
19
20
import org.apache.tools.ant.TimeoutException;
20
import org.apache.tools.ant.taskdefs.WaitFor;
21
import org.apache.tools.ant.taskdefs.WaitFor;
21
22
22
/**
23
/**
Lines 51-62 Link Here
51
52
52
    /**
53
    /**
53
     * If the wait fails, a BuildException is thrown. All the superclasses actions are called first.
54
     * If the wait fails, a BuildException is thrown. All the superclasses actions are called first.
54
     * @throws BuildTimeoutException on timeout, using the text in {@link #text}
55
     * @throws TimeoutException on timeout, using the text in {@link #text}
55
     *
56
     */
56
     */
57
    protected void processTimeout() throws BuildTimeoutException {
57
    protected void processTimeout() {
58
        super.processTimeout();
58
        super.processTimeout();
59
        throw new BuildTimeoutException(text, getLocation());
59
        throw new TimeoutException(text, getLocation());
60
    }
60
    }
61
61
62
    /**
62
    /**
(-)src/main/org/apache/tools/ant/taskdefs/Java.java (-5 / +5 lines)
Lines 28-33 Link Here
28
import org.apache.tools.ant.Project;
28
import org.apache.tools.ant.Project;
29
import org.apache.tools.ant.Task;
29
import org.apache.tools.ant.Task;
30
import org.apache.tools.ant.ExitStatusException;
30
import org.apache.tools.ant.ExitStatusException;
31
import org.apache.tools.ant.TimeoutException;
31
import org.apache.tools.ant.types.Commandline;
32
import org.apache.tools.ant.types.Commandline;
32
import org.apache.tools.ant.types.CommandlineJava;
33
import org.apache.tools.ant.types.CommandlineJava;
33
import org.apache.tools.ant.types.Environment;
34
import org.apache.tools.ant.types.Environment;
Lines 76-83 Link Here
76
    private boolean spawn = false;
77
    private boolean spawn = false;
77
    private boolean incompatibleWithSpawn = false;
78
    private boolean incompatibleWithSpawn = false;
78
79
79
    private static final String TIMEOUT_MESSAGE = 
80
    private static final String TIMEOUT_MESSAGE = ExecTask.TIMEOUT_MESSAGE;
80
        "Timeout: killed the sub-process";
81
81
82
    /**
82
    /**
83
     * Normal constructor
83
     * Normal constructor
Lines 231-237 Link Here
231
            if (failOnError) {
231
            if (failOnError) {
232
                throw e;
232
                throw e;
233
            } else {
233
            } else {
234
                if (TIMEOUT_MESSAGE.equals(e.getMessage())) {
234
                if (e instanceof TimeoutException) {
235
                    log(TIMEOUT_MESSAGE);
235
                    log(TIMEOUT_MESSAGE);
236
                } else {
236
                } else {
237
                    log(e);
237
                    log(e);
Lines 771-777 Link Here
771
            exe.execute(getProject());
771
            exe.execute(getProject());
772
            redirector.complete();
772
            redirector.complete();
773
            if (exe.killedProcess()) {
773
            if (exe.killedProcess()) {
774
                throw new BuildException(TIMEOUT_MESSAGE);
774
                throw new TimeoutException(TIMEOUT_MESSAGE);
775
            }
775
            }
776
        } catch (IOException e) {
776
        } catch (IOException e) {
777
            throw new BuildException(e);
777
            throw new BuildException(e);
Lines 791-797 Link Here
791
            int rc = exe.execute();
791
            int rc = exe.execute();
792
            redirector.complete();
792
            redirector.complete();
793
            if (exe.killedProcess()) {
793
            if (exe.killedProcess()) {
794
                throw new BuildException(TIMEOUT_MESSAGE);
794
                throw new TimeoutException(TIMEOUT_MESSAGE);
795
            }
795
            }
796
            return rc;
796
            return rc;
797
        } catch (IOException e) {
797
        } catch (IOException e) {
(-)src/main/org/apache/tools/ant/ExecutedProgramFailedException.java (+79 lines)
Line 0 Link Here
1
/**
2
 * Licensed to the Apache Software Foundation (ASF) under one
3
 * or more contributor license agreements.  See the NOTICE file
4
 * distributed with this work for additional information
5
 * regarding copyright ownership.  The ASF licenses this file
6
 * to you under the Apache License, Version 2.0 (the
7
 * "License"); you may not use this file except in compliance
8
 * with the License.  You may obtain a copy of the License at
9
 *
10
 *     http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing, software
13
 * distributed under the License is distributed on an "AS IS" BASIS,
14
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
 * See the License for the specific language governing permissions and
16
 * limitations under the License.
17
 */
18
19
package org.apache.tools.ant;
20
21
/**
22
 * This exception is raised when an executed program failed with a return code.
23
 * The return code and the executable are retained as fields in the exception.
24
 */
25
26
public class ExecutedProgramFailedException extends BuildException {
27
28
    private final int returnCode;
29
    private final String executable;
30
    private static final long serialVersionUID = -9169102418614402332L;
31
32
    /**
33
     * Construct an exception.
34
     * @param message text message
35
     * @param returnCode the return code
36
     * @param executable the executable that failed
37
     */
38
    public ExecutedProgramFailedException(String message,
39
                                          int returnCode,
40
                                          String executable) {
41
        super(message);
42
        this.returnCode = returnCode;
43
        this.executable = executable;
44
    }
45
46
    /**
47
     *
48
     * Construct an exception.
49
     * @param message text message
50
     * @param location the location in the build file
51
     * @param returnCode the return code
52
     * @param executable the executable that failed
53
     */
54
    public ExecutedProgramFailedException(String message,
55
                                          Location location,
56
                                          int returnCode,
57
                                          String executable) {
58
        super(message, location);
59
        this.returnCode = returnCode;
60
        this.executable = executable;
61
    }
62
63
    /**
64
     * Get the return code from the program
65
     * @return the return code. Most platforms assume 0 == success, non-zero == failure.
66
     */
67
    public int getReturnCode() {
68
        return returnCode;
69
    }
70
71
    /**
72
     * The program that failed
73
     * @return the program that failed.
74
     */
75
    public String getExecutable() {
76
        return executable;
77
    }
78
79
}
(-)src/main/org/apache/tools/ant/taskdefs/Parallel.java (-4 / +10 lines)
Lines 17-23 Link Here
17
 */
17
 */
18
package org.apache.tools.ant.taskdefs;
18
package org.apache.tools.ant.taskdefs;
19
19
20
import java.lang.reflect.Method;
21
import java.util.Enumeration;
20
import java.util.Enumeration;
22
import java.util.Vector;
21
import java.util.Vector;
23
import java.util.List;
22
import java.util.List;
Lines 26-31 Link Here
26
import org.apache.tools.ant.Location;
25
import org.apache.tools.ant.Location;
27
import org.apache.tools.ant.Task;
26
import org.apache.tools.ant.Task;
28
import org.apache.tools.ant.TaskContainer;
27
import org.apache.tools.ant.TaskContainer;
28
import org.apache.tools.ant.TimeoutException;
29
import org.apache.tools.ant.property.LocalProperties;
29
import org.apache.tools.ant.property.LocalProperties;
30
import org.apache.tools.ant.util.StringUtils;
30
import org.apache.tools.ant.util.StringUtils;
31
31
Lines 357-366 Link Here
357
        }
357
        }
358
358
359
        if (interrupted) {
359
        if (interrupted) {
360
            throw new BuildException("Parallel execution interrupted.");
360
            throw new ParallelInterruptedException("Parallel execution interrupted.");
361
        }
361
        }
362
        if (timedOut) {
362
        if (timedOut) {
363
            throw new BuildException("Parallel execution timed out");
363
            throw new TimeoutException("Parallel execution timed out");
364
        }
364
        }
365
365
366
        // now did any of the threads throw an exception
366
        // now did any of the threads throw an exception
Lines 468-471 Link Here
468
        }
468
        }
469
    }
469
    }
470
470
471
}
471
    public static final class ParallelInterruptedException extends BuildException {
472
        public ParallelInterruptedException(final String message) {
473
            super(message);
474
        }
475
    }
476
477
}
(-)src/main/org/apache/tools/ant/taskdefs/optional/testing/Funtest.java (-1 / +6 lines)
Lines 22-27 Link Here
22
import org.apache.tools.ant.Project;
22
import org.apache.tools.ant.Project;
23
import org.apache.tools.ant.BuildException;
23
import org.apache.tools.ant.BuildException;
24
import org.apache.tools.ant.TaskAdapter;
24
import org.apache.tools.ant.TaskAdapter;
25
import org.apache.tools.ant.TimeoutException;
25
import org.apache.tools.ant.util.WorkerAnt;
26
import org.apache.tools.ant.util.WorkerAnt;
26
import org.apache.tools.ant.taskdefs.condition.Condition;
27
import org.apache.tools.ant.taskdefs.condition.Condition;
27
import org.apache.tools.ant.taskdefs.condition.ConditionBase;
28
import org.apache.tools.ant.taskdefs.condition.ConditionBase;
Lines 458-463 Link Here
458
            worker.start();
459
            worker.start();
459
            //start the probe+test sequence
460
            //start the probe+test sequence
460
            timedTests.execute();
461
            timedTests.execute();
462
        } catch (TimeoutException e) {
463
            testException = new TimeoutException("Test run timed out after "
464
                    + ((int)(testRunTimeout/1000)) + "s:",
465
                    e);          
461
        } catch (BuildException e) {
466
        } catch (BuildException e) {
462
            //Record the exception and continue
467
            //Record the exception and continue
463
            testException = e;
468
            testException = e;
Lines 520-526 Link Here
520
525
521
        //look for an application fault
526
        //look for an application fault
522
        if (applicationException != null) {
527
        if (applicationException != null) {
523
            if (taskException == null || taskException instanceof BuildTimeoutException) {
528
            if (taskException == null || taskException instanceof TimeoutException) {
524
                taskException = applicationException;
529
                taskException = applicationException;
525
            } else {
530
            } else {
526
                ignoringThrowable(APPLICATION_EXCEPTION, applicationException);
531
                ignoringThrowable(APPLICATION_EXCEPTION, applicationException);
(-)src/main/org/apache/tools/ant/taskdefs/Javac.java (-9 / +18 lines)
Lines 1051-1062 Link Here
1051
            throw new BuildException("srcdir attribute must be set!",
1051
            throw new BuildException("srcdir attribute must be set!",
1052
                                     getLocation());
1052
                                     getLocation());
1053
        }
1053
        }
1054
1054
        if (destDir != null && !destDir.exists()) {
1055
            throw new BuildException("destination directory \""
1056
                    + destDir
1057
                    + "\" does not exist ",
1058
                    getLocation());
1059
        }
1055
        if (destDir != null && !destDir.isDirectory()) {
1060
        if (destDir != null && !destDir.isDirectory()) {
1056
            throw new BuildException("destination directory \""
1061
            throw new BuildException("destination directory \""
1057
                                     + destDir
1062
                    + destDir
1058
                                     + "\" does not exist "
1063
                    + " is not a directory",
1059
                                     + "or is not a directory", getLocation());
1064
                    getLocation());
1060
        }
1065
        }
1061
        if (includeAntRuntime == null && getProject().getProperty("build.sysclasspath") == null) {
1066
        if (includeAntRuntime == null && getProject().getProperty("build.sysclasspath") == null) {
1062
            log(getLocation() + "warning: 'includeantruntime' was not set, " +
1067
            log(getLocation() + "warning: 'includeantruntime' was not set, " +
Lines 1072-1085 Link Here
1072
     */
1077
     */
1073
    protected void compile() {
1078
    protected void compile() {
1074
        String compilerImpl = getCompiler();
1079
        String compilerImpl = getCompiler();
1075
1080
        int fileCount = compileList.length;
1076
        if (compileList.length > 0) {
1081
        if (fileCount> 0) {
1077
            log("Compiling " + compileList.length + " source file"
1082
            log("Compiling " + fileCount + " source file"
1078
                + (compileList.length == 1 ? "" : "s")
1083
                + (fileCount == 1 ? "" : "s")
1079
                + (destDir != null ? " to " + destDir : ""));
1084
                + (destDir != null ? " to " + destDir : ""));
1080
1085
1081
            if (listFiles) {
1086
            if (listFiles) {
1082
                for (int i = 0; i < compileList.length; i++) {
1087
                for (int i = 0; i < fileCount; i++) {
1083
                  String filename = compileList[i].getAbsolutePath();
1088
                  String filename = compileList[i].getAbsolutePath();
1084
                  log(filename);
1089
                  log(filename);
1085
                }
1090
                }
Lines 1092-1100 Link Here
1092
1097
1093
            // now we need to populate the compiler adapter
1098
            // now we need to populate the compiler adapter
1094
            adapter.setJavac(this);
1099
            adapter.setJavac(this);
1100
            long time = System.currentTimeMillis();
1095
1101
1096
            // finally, lets execute the compiler!!
1102
            // finally, lets execute the compiler!!
1097
            if (adapter.execute()) {
1103
            if (adapter.execute()) {
1104
                time = System.currentTimeMillis() - time;
1105
                log("Compiled " + fileCount + " file" + (fileCount > 1 ? "s" : "")
1106
                        + " in " + time + " milliseconds.", Project.MSG_VERBOSE);
1098
                // Success
1107
                // Success
1099
                try {
1108
                try {
1100
                    generateMissingPackageInfoClasses();
1109
                    generateMissingPackageInfoClasses();
(-)src/main/org/apache/tools/ant/taskdefs/ExecTask.java (-2 / +4 lines)
Lines 27-32 Link Here
27
import org.apache.tools.ant.BuildException;
27
import org.apache.tools.ant.BuildException;
28
import org.apache.tools.ant.Project;
28
import org.apache.tools.ant.Project;
29
import org.apache.tools.ant.Task;
29
import org.apache.tools.ant.Task;
30
import org.apache.tools.ant.TimeoutException;
30
import org.apache.tools.ant.taskdefs.condition.Os;
31
import org.apache.tools.ant.taskdefs.condition.Os;
31
import org.apache.tools.ant.types.Commandline;
32
import org.apache.tools.ant.types.Commandline;
32
import org.apache.tools.ant.types.Environment;
33
import org.apache.tools.ant.types.Environment;
Lines 78-83 Link Here
78
     * command
79
     * command
79
     */
80
     */
80
    private boolean vmLauncher = true;
81
    private boolean vmLauncher = true;
82
    public static final String TIMEOUT_MESSAGE = "Timeout: killed the sub-process";
81
83
82
84
83
    /**
85
    /**
Lines 636-644 Link Here
636
638
637
            //test for and handle a forced process death
639
            //test for and handle a forced process death
638
            if (exe.killedProcess()) {
640
            if (exe.killedProcess()) {
639
                String msg = "Timeout: killed the sub-process";
641
                String msg = TIMEOUT_MESSAGE;
640
                if (failOnError) {
642
                if (failOnError) {
641
                    throw new BuildException(msg);
643
                    throw new TimeoutException(msg);
642
                } else {
644
                } else {
643
                    log(msg, Project.MSG_WARN);
645
                    log(msg, Project.MSG_WARN);
644
                }
646
                }

Return to bug 50181