| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
by replacing context.projectDirectory by workingDirectory and using
it as the default but allowing it to being overridden
|
| |
|
|
|
|
|
|
|
|
| |
command which was previously hard-coded
This will allow multi-project builds, too but we should first fix
caching across instances and GitDependencies on sub-builds within
other repositories.
|
|\
| |
| | |
Minor dotty plugin improvements
|
| | |
|
|/ |
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
using lastModified instead of a non-idempotent needsUpdate flag
this fixes a bug where dependees would not be rebuilt if cbt exited
or was killed after dependencies were already rebuilt.
|
| |
|
|
|
|
|
| |
this will make it possible to access lastModified times and cache them
in the following commits
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The concurrent hashmap approach to classloader caching was flawed.
Assume you have two concurrently running builds A and B and projects
P2 and P3 depending on project P1. And assume a time sequence where A
compiles P1, then compiles P2, then P1’s sources change, then B compiles
P1, then A compiles P3. At the end P2 and P3 will have different
versions of P1 as their parent classloaders. This is inconsistent.
The easiest way to work around this is making sure only one thread is
changing the classloader cache during it’s entire run. This would mean
either no concurrency or what we have done here, which is letting
threads work on a copy of the cache and replace the original cache in
the end using an atomic operation. This means the thread that finishes
last wins, but for caching that’s fine. Worst case some things aren’t
cached in a concurrent execution.
This change also means that we don’t need concurrent hashmaps for the
classloader cache anymore since no two theads will access the same
hashmap. We still need a concurrent hashmap for the class caches inside
of the classloaders as multiple threads can access the same
classloaders.
|
|
|
|
|
|
|
| |
This isn’t type-safe, but re-using that same hashmap for both keys and
classloaders allows to reduce the number of members in Context. Also
we can re-use the same hashMap for other things as well in the coming
commits, e.g. timestamps.
|
| |
|
|\
| |
| | |
minor cleanups regarding Context
|
| | |
|
|/ |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
cbtHasChanged does never change across one run. However
classLoaderRecursion removes the corresponding classloader if
needsUpdate is true. It is called multiple times meaning it removes
and re-creates the classloader on every call leading to potentially
multiple conflicting cbt classloaders. needsUpdate should never be
returning true more than ones across a single run. Otherwise it can
lead to this error:
java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "Build.lib()Lcbt/Lib;" the class loader (instance of cbt/URLClassLoader) of the current class, Build, and the class loader (instance of cbt/URLClassLoader) for interface cbt/BaseBuild have different Class objects for the type cbt/Lib used in the signature
|
| |
|
| |
|
|
|
|
|
| |
The exact precedence rule of override code vs original code may still
need to be tweaked as we go along.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
Before it only affected jdk, because scala.Console captures our and err
before the swap.
This is needed when running main classes like Scaladoc or the compiler
and wanting to redirect output to standard error
|
| |
|
|
|
|
|
|
|
|
|
|
| |
A SecurityManager is once installed globally and stays the same across
all classloaders. TrapSecurityManager was installed this way, but it
looked up the `trapExitCode` in it's own classloader, while
classes in other classloaders (when cbt was using another version of
cbt) were writing it to their own classloader. This flag needs to be in
a global place instead to fix this, so we'll put it straight into the
TrapSecurityManager itself.
|
|
|
|
|
| |
and it becomes slightly easier to maintain source compatibility
between cbt versions
|
| |
|
|
|
|
| |
if multiple main classes are found
|
| |
|
|
|
|
| |
and work around the fact that the main method is not static (huh?)
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
Installing one globally for the JVM live-time and make behavior dependent
on a thread local variable seems safer than globally switching it out
and having race conditions.
Also now all other calls are forwarded to a potential Nailgun
SecurityManager, which should fix some bugs.
|
|
|
|
|
|
|
| |
Proxy settings can be supplied either via Java system-properties or via
environment variables (http_proxy/https_proxy/no_proxy).
Java system-properties take precedence over env vars. Evaluation of
proxy settings happens only during nailgun startup for now.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* scalariform: improve logging, declare tasks final
* scalafmt plugin implementation
* add scalafmt and scalariform plugins and examples to tests
* fix logging guarded logging behaviour
* add notes about formatting check to README
* fix compilation error in examples
|
|
|
|
|
|
| |
- Restructure code as 1 library case class and 1 Build mixin trait. A library is generally easier to understand and could be re-used independently. 1 trait seems simpler than several here.
- Let not the plugin create the multi-project build, but the user project manually. I think while this adds some minor code overhead it is much simpler to understand. Fewer tasks and other moving parts needed.
- Remove verbose nested sbt-style folder structure. It's simpler without it :).
|
|
|
|
|
|
| |
- move plugins into cbt namespace
- enable scalac warnings in builds by default
- merged language flags into AdvancedScala trait
|
| |
|
|
|
|
| |
changes builds from using immutable.Seq to using Predef.Seq in favor of simplicity over purity. This has been discussed on gitter.
|