View build.gradle
├── foo
│   └── fum.txt
├── bar
│   └── other.txt
└── biz
   └── baf
   └── bop

Litmus Test for VCS Repository Separation

How do you or should you break a monolithic repository into smaller pieces?

The question of whether separation should take place and how granular it should be is a debate that happens in very significantly large project I've been involved with to date.

If the goal is to make developers lives easier, then the split must certainly not cause more harm than good. There can't be a hard and fast rule such as "each module should have it's own repository" because the day to day impact of a project maintained by a single individual could be horrendous if the project contains hundreds of modules. On the other hand, a project with thoudsands of developers and thoudsands of modules likely will struggle equaly with such a rule.

Therefore I'm working on a initial litmus test to determine the criteria for breaking a large repository into several smaller repositories.

View first-stacktrace-log
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(
at com.liferay.ant.bnd.version.VersionVerifierPlugin.verify(
at aQute.bnd.osgi.Verifier.doVerifierPlugins(
at aQute.bnd.osgi.Verifier.verify(
at aQute.bnd.osgi.Builder.doVerify(
at aQute.bnd.osgi.Builder$build$ Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(
View gradle.log
[rotty@rotty-XPS-15-9530 (pr-1030 *$) portal-rest-extender-test]$ ../../../gradlew clean deploy --stacktrace
Configuration on demand is an incubating feature.
:portal:portal-rest-extender-test:cleanBuildCSS UP-TO-DATE
:portal:portal-rest-extender-test:cleanBuildXSD UP-TO-DATE
:portal:portal-rest-extender-test:cleanCompileTestJava UP-TO-DATE
:portal:portal-rest-extender-test:cleanConfigJSModules UP-TO-DATE
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
spin() {
local s=("|" "/" "-" '\x5C')
local i=0
while kill -0 $1 2> /dev/null; do
echo -en "[${s[$i]}]"\\r
i=$(( $i == 3 ? 0 : $i + 1 ))
sleep .1
checkoutMasterSubmodule() {
local name=${1##*/}
echo "[----> Initing Submodule '${name}']"
git submodule update "${name}" 2>/dev/null
cd "${name}"
git checkout master 2>/dev/null
# Get it!
wget -O
# Unzip it!
# Trim off some legacy apps!
rm -rf liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/calendar-portlet liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/marketplace-portlet liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/opensocial-portlet liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/web-form-portlet liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/kaleo-web liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/notifications-portlet liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/resources-importer-web liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/sync-web liferay-portal-7.0-ce-m4/tomcat-7.0.42/webapps/welcome-theme
property = {
"osgi.http.whiteboard.servlet.pattern=/kaleo/resources/*" // temporary since this was the old property
service = Servlet.class
public class DDMJsResources extends HttpServlet {
View bnd.bnd