use of io.fabric8.api.commands.GitVersions in project fabric8 by jboss-fuse.
the class DummyBatchingProgressMonitor method gitVersions.
@Override
public GitVersions gitVersions() {
LockHandle readLock = aquireReadLock();
try {
assertValid();
GitOperation<GitVersions> gitop = new GitOperation<GitVersions>() {
public GitVersions call(Git git, GitContext context) throws Exception {
List<GitVersion> localVersions = GitHelpers.gitVersions(git);
return new GitVersions(localVersions);
}
};
return executeInternal(newGitReadContext(), null, gitop);
} finally {
readLock.unlock();
}
}
use of io.fabric8.api.commands.GitVersions in project fabric8 by jboss-fuse.
the class FabricGitSummaryAction method performContainerAction.
@Override
protected void performContainerAction(String queuePath, String containerName) throws Exception {
JMXRequest containerRequest = new JMXRequest().withObjectName("io.fabric8:type=Fabric").withMethod("gitVersions");
requests.put(containerName, containerRequest);
String command = map(containerRequest);
curator.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath(queuePath, PublicStringSerializer.serialize(command));
}
use of io.fabric8.api.commands.GitVersions in project fabric8 by jboss-fuse.
the class FabricGitSummaryAction method beforeEachContainer.
@Override
protected void beforeEachContainer(Collection<String> names) throws Exception {
// first, we need summary from fabric-git-server (to have something to compare local git repositories to)
master = fabricService.getGitMaster();
if (master == null) {
System.out.println("Can't find container which is current git master");
return;
}
System.out.println("Git master is: " + master);
// ask master about the status first
String queuePath = ZkPath.COMMANDS_REQUESTS_QUEUE.getPath(master);
masterRequest = new JMXRequest().withObjectName("io.fabric8:type=GitServer").withMethod("gitVersions");
String command = map(masterRequest);
curator.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath(queuePath, PublicStringSerializer.serialize(command));
}
use of io.fabric8.api.commands.GitVersions in project fabric8 by jboss-fuse.
the class FabricGitSummaryAction method afterEachContainer.
@Override
protected void afterEachContainer(Collection<String> names) {
System.out.printf("Scheduled git-summary command to %d containers. Awaiting response(s).\n", names.size());
final CountDownLatch latch = new CountDownLatch(requests.size() + (masterRequest == null ? 0 : 1));
Thread waiter = null;
try {
waiter = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
String currentContainer = null;
try {
// master request
if (masterRequest != null && masterResult == null) {
currentContainer = master;
List<JMXResult> results = fetchResponses(master);
for (JMXResult result : results) {
if (result.getCorrelationId().equals(masterRequest.getId())) {
masterResult = result;
latch.countDown();
break;
}
}
}
// requests for containers
for (Map.Entry<String, JMXRequest> req : requests.entrySet()) {
currentContainer = req.getKey();
List<JMXResult> containerResults = fetchResponses(currentContainer);
for (JMXResult result : containerResults) {
if (result.getCorrelationId().equals(req.getValue().getId())) {
results.put(currentContainer, result);
latch.countDown();
break;
}
}
}
if ((masterRequest == null || masterResult != null) && results.size() == requests.size()) {
break;
} else {
// active waiting - so no need for ZK watchers, etc...
Thread.sleep(1000);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
} catch (Exception e) {
System.err.println("Problem occurred while fetching response from " + currentContainer + " container: " + e.getMessage());
// active waiting - so no need for ZK watchers, etc...
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
}
}
}
}
});
waiter.start();
boolean finished = latch.await(timeout, TimeUnit.MILLISECONDS);
if (!finished) {
waiter.interrupt();
System.out.println("Timeout waiting for git-summary response");
return;
}
// before printing summary, let's check if there are out of sync containers
Map<String, String> centralGitRepo = new HashMap<>();
Set<String> outOfSyncContainers = new TreeSet<>();
if (masterResult != null) {
for (GitVersion version : ((GitVersions) masterResult.getResponse()).getVersions()) {
centralGitRepo.put(version.getVersion(), version.getSha1());
}
for (String containerName : results.keySet()) {
List<GitVersion> localRepo = ((GitVersions) results.get(containerName).getResponse()).getVersions();
for (GitVersion version : localRepo) {
String ref = centralGitRepo.get(version.getVersion());
if (ref == null) {
// local container knows about version, which is not tracked in central repo
outOfSyncContainers.add(containerName);
} else if (!ref.equals(version.getSha1())) {
// version not in sync
outOfSyncContainers.add(containerName);
}
}
if (localRepo.size() != centralGitRepo.size()) {
// extra or not-in-sync versions handled, so this must mean some central version is not
// available locally
outOfSyncContainers.add(containerName);
}
}
if (outOfSyncContainers.size() > 0) {
System.out.println();
System.out.println("Containers that require synchronization: " + outOfSyncContainers);
System.out.println("Please use \"fabric:git-synchronize\" command");
}
} else {
System.out.println();
System.out.println("Can't determine synchronization status of containers - no master Git repository detected");
}
// now summary time
if (masterResult != null) {
System.out.println();
printVersions("=== Summary for master Git repository (container: " + master + ") ===", ((GitVersions) masterResult.getResponse()).getVersions());
}
System.out.println();
for (String containerName : results.keySet()) {
printVersions("=== Summary for local Git repository (container: " + containerName + ") ===", ((GitVersions) results.get(containerName).getResponse()).getVersions());
System.out.println();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
waiter.interrupt();
System.out.println("Interrupted waiting for git-summary response");
}
}
use of io.fabric8.api.commands.GitVersions in project fabric8 by jboss-fuse.
the class GitHelpers method gitVersions.
/**
* Fetches summary information (list of {@link GitVersion}) for given {@link Git} instance.
* @param git
* @return
* @throws GitAPIException
* @throws IOException
*/
public static List<GitVersion> gitVersions(Git git) throws GitAPIException, IOException {
List<Ref> refs = git.branchList().call();
List<GitVersion> localVersions = new LinkedList<>();
for (Ref ref : refs) {
String v = ref.getName();
if (v.startsWith("refs/heads/")) {
String name = v.substring(("refs/heads/").length());
if (name.startsWith("patch-") || name.startsWith("patches-") || name.startsWith("container-history")) {
continue;
}
GitVersion gv = new GitVersion(name);
gv.setSha1(ref.getObjectId().getName());
RevCommit headCommit = new RevWalk(git.getRepository()).parseCommit(ref.getObjectId());
if (headCommit != null) {
gv.setMessage(headCommit.getShortMessage());
gv.setTimestamp(TIMESTAMP.format(new Date(headCommit.getCommitTime() * 1000L)));
}
localVersions.add(gv);
}
}
return localVersions;
}
Aggregations