| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Code is much simpler now.
Now cbt sub-tasks are separated by . instead of spaces to
unify the syntax with method calls Scala. Also the reflective
code now works not only on builds but any kind of values,
so zero argument members of any types of return values can
simply be called.
This is also a large step towards detangling the reflective
lookup from cbt and turning it into a fully fletched
shell to Scala "native" call solution.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
This should allow for build to add other builds to their dependencies
and interact with them in a type-safe way. And ever regardless it seems
like good practice to never have the same class existing in the same
package or the top-level package even if they don’t end up on the same
classpath. This might also help make stack traces easier to understand.
Also improve error messages for mistakes with the build class, e.g.
constructor, super classes, etc.
|
|
|
|
| |
should be safe now that we rebuild based on lastModified
|
| |
|
|
|
|
| |
useful for `dotty run <file>`
|
| |
|
|
|
|
|
| |
and prepares for allowing `run` and `runFlat` at
Dependency instead of Build level
|
|
|
|
|
| |
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.
|
| |
|