Search in sources :

Example 6 with TrackingRefUpdate

use of org.eclipse.jgit.transport.TrackingRefUpdate in project gitblit by gitblit.

the class MirrorService method run.

@Override
public void run() {
    if (!isReady()) {
        return;
    }
    running.set(true);
    for (String repositoryName : repositoryManager.getRepositoryList()) {
        if (forceClose.get()) {
            break;
        }
        if (repositoryManager.isCollectingGarbage(repositoryName)) {
            logger.debug("mirror is skipping {} garbagecollection", repositoryName);
            continue;
        }
        RepositoryModel model = null;
        Repository repository = null;
        try {
            model = repositoryManager.getRepositoryModel(repositoryName);
            if (!model.isMirror && !model.isBare) {
                // repository must be a valid bare git mirror
                logger.debug("mirror is skipping {} !mirror !bare", repositoryName);
                continue;
            }
            repository = repositoryManager.getRepository(repositoryName);
            if (repository == null) {
                logger.warn(MessageFormat.format("MirrorExecutor is missing repository {0}?!?", repositoryName));
                continue;
            }
            // automatically repair (some) invalid fetch ref specs
            if (!repairAttempted.contains(repositoryName)) {
                repairAttempted.add(repositoryName);
                JGitUtils.repairFetchSpecs(repository);
            }
            // find the first mirror remote - there should only be one
            StoredConfig rc = repository.getConfig();
            RemoteConfig mirror = null;
            List<RemoteConfig> configs = RemoteConfig.getAllRemoteConfigs(rc);
            for (RemoteConfig config : configs) {
                if (config.isMirror()) {
                    mirror = config;
                    break;
                }
            }
            if (mirror == null) {
                // repository does not have a mirror remote
                logger.debug("mirror is skipping {} no mirror remote found", repositoryName);
                continue;
            }
            logger.debug("checking {} remote {} for ref updates", repositoryName, mirror.getName());
            final boolean testing = false;
            Git git = new Git(repository);
            CredentialsProvider creds = null;
            URIish fetchUri = mirror.getURIs().get(0);
            if (fetchUri.getUser() != null && fetchUri.getPass() != null) {
                creds = new UsernamePasswordCredentialsProvider(fetchUri.getUser(), fetchUri.getPass());
            }
            FetchResult result = git.fetch().setCredentialsProvider(creds).setRemote(mirror.getName()).setDryRun(testing).call();
            Collection<TrackingRefUpdate> refUpdates = result.getTrackingRefUpdates();
            if (refUpdates.size() > 0) {
                ReceiveCommand ticketBranchCmd = null;
                for (TrackingRefUpdate ru : refUpdates) {
                    StringBuilder sb = new StringBuilder();
                    sb.append("updated mirror ");
                    sb.append(repositoryName);
                    sb.append(" ");
                    sb.append(ru.getRemoteName());
                    sb.append(" -> ");
                    sb.append(ru.getLocalName());
                    if (ru.getResult() == Result.FORCED) {
                        sb.append(" (forced)");
                    }
                    sb.append(" ");
                    sb.append(ru.getOldObjectId() == null ? "" : ru.getOldObjectId().abbreviate(7).name());
                    sb.append("..");
                    sb.append(ru.getNewObjectId() == null ? "" : ru.getNewObjectId().abbreviate(7).name());
                    logger.info(sb.toString());
                    if (BranchTicketService.BRANCH.equals(ru.getLocalName())) {
                        ReceiveCommand.Type type = null;
                        switch(ru.getResult()) {
                            case NEW:
                                type = Type.CREATE;
                                break;
                            case FAST_FORWARD:
                                type = Type.UPDATE;
                                break;
                            case FORCED:
                                type = Type.UPDATE_NONFASTFORWARD;
                                break;
                            default:
                                type = null;
                                break;
                        }
                        if (type != null) {
                            ticketBranchCmd = new ReceiveCommand(ru.getOldObjectId(), ru.getNewObjectId(), ru.getLocalName(), type);
                        }
                    }
                }
                if (ticketBranchCmd != null) {
                    repository.fireEvent(new ReceiveCommandEvent(model, ticketBranchCmd));
                }
            }
        } catch (Exception e) {
            logger.error("Error updating mirror " + repositoryName, e);
        } finally {
            // cleanup
            if (repository != null) {
                repository.close();
            }
        }
    }
    running.set(false);
}
Also used : URIish(org.eclipse.jgit.transport.URIish) ReceiveCommand(org.eclipse.jgit.transport.ReceiveCommand) UsernamePasswordCredentialsProvider(org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider) FetchResult(org.eclipse.jgit.transport.FetchResult) RepositoryModel(com.gitblit.models.RepositoryModel) UsernamePasswordCredentialsProvider(org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider) CredentialsProvider(org.eclipse.jgit.transport.CredentialsProvider) TrackingRefUpdate(org.eclipse.jgit.transport.TrackingRefUpdate) Type(org.eclipse.jgit.transport.ReceiveCommand.Type) StoredConfig(org.eclipse.jgit.lib.StoredConfig) Repository(org.eclipse.jgit.lib.Repository) Git(org.eclipse.jgit.api.Git) ReceiveCommandEvent(com.gitblit.git.ReceiveCommandEvent) RemoteConfig(org.eclipse.jgit.transport.RemoteConfig)

Aggregations

TrackingRefUpdate (org.eclipse.jgit.transport.TrackingRefUpdate)6 ArrayList (java.util.ArrayList)3 GitAPIException (org.eclipse.jgit.api.errors.GitAPIException)3 FetchResult (org.eclipse.jgit.transport.FetchResult)3 ReceiveCommand (org.eclipse.jgit.transport.ReceiveCommand)3 IOException (java.io.IOException)2 FetchCommand (org.eclipse.jgit.api.FetchCommand)2 Git (org.eclipse.jgit.api.Git)2 Repository (org.eclipse.jgit.lib.Repository)2 StoredConfig (org.eclipse.jgit.lib.StoredConfig)2 ReceiveCommandEvent (com.gitblit.git.ReceiveCommandEvent)1 RepositoryModel (com.gitblit.models.RepositoryModel)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 GitException (org.eclipse.che.api.git.exception.GitException)1 CheckoutCommand (org.eclipse.jgit.api.CheckoutCommand)1 CloneCommand (org.eclipse.jgit.api.CloneCommand)1 DeleteBranchCommand (org.eclipse.jgit.api.DeleteBranchCommand)1 ListBranchCommand (org.eclipse.jgit.api.ListBranchCommand)1