Обновляйте только внешние папки с репо, кроме внешних - PullRequest
0 голосов
/ 27 марта 2020

КОНТЕКСТ

У нас есть довольно большой SVN-репозиторий в нашей компании, где мы храним наш продукт. Это рабочее пространство с множеством различных файлов, которые являются частью того, что мы предоставляем нашим клиентам. Поскольку все наши отделы работают в одной рабочей области, она стала довольно большой (40 ГБ +), и поскольку мы не можем переключиться на другой вид управления этими данными, мне было поручено написать ManagerTool, который управляет различными SVN-элементами (-каталогами) в этой рабочей области, и делает его графически доступным для разработчиков. После выбора набора (10-25 подкаталогов) они могут нажать кнопку, и MangereTool проверяет только эту часть рабочей области.

Поскольку мы также сотрудничаем с другими компаниями, мы включаем внешние компоненты из их репозиториев SVN довольно глубоко в нашем собственном репо.

ВЫПУСК

Я хочу извлекать внешние данные в каталоге, например ("workspace / packages / {departement} / {subject} / external"). Проблема в том, что у нас есть структура каталогов, подобная этой:

workspace
  >packages
      >department1
      >department2
           >subject1
           >subject2
                >payload1
                >payload2
                >external1

Поэтому, когда я извлекаю только внешний (в большинстве случаев это вариант использования), мне нужно извлекать папку верхнего уровня и делать его глубина не рекурсивная, но в аренду меньше, чем для уменьшения размера кассы. После проверки рабочая область / packages / departement2 / subject2 я затем добавляю svn: external svn: external.host/svn/xx/xx/xx external1 в subject2 и обновите папку subject2 с минимальной глубиной.

public static void checkoutSvnElement(final SvnElementViewModel svnElement, final SourceSvnViewModel root)
        throws Exception {
    if (!initWorkspace(root)) {
        throw new Exception(Messages.getString("SvnHelper.error_workspace_not_initialized")); 
    }
    if (svnElement.externalProperty().getValue()) {
        addAndUpdateExternal(svnElement, root);
    } else {
        checkoutFolderInWorkspace(svnElement, root);
    }
}

private static void addAndUpdateExternal(final SvnElementViewModel svnElement, final SourceSvnViewModel rootSvnElement) throws Exception {
    try {
        final String svnPath = svnElement.svnPathProperty().getValue();
        final String localPath = svnElement.localPathProperty().getValue();
        final File targetFile = new File(PreferenceManager.getTargetTrunkPath(rootSvnElement), localPath);
        final File parentTargetFile = targetFile.getParentFile();
        final String externalFolderName = localPath.substring(localPath.lastIndexOf("/") + 1);

        final SVNPropertyValue externalProperty = SVNPropertyValue.create(String.format("\"%s\" \"%s\"", svnPath, externalFolderName)); 

        if (!parentTargetFile.exists()) {
            clientManager.getUpdateClient().doUpdate(parentTargetFile, SVNRevision.HEAD, SVNDepth.IMMIDIATE,true, true, true);
        }
        clientManager.getWCClient().doSetProperty(parentTargetFile, "svn:externals", externalProperty, false, SVNDepth.EMPTY, null, null);
        clientManager.getUpdateClient().doUpdate(parentTargetFile, SVNRevision.HEAD, SVNDepth.INFINITY, false, false, true);
    } catch (final SVNException e) {
        throw new Exception("", e);
    }
}

Проблема в том, что мы не хотим (и не можем) реализовать весь TortoiseSVN Client для поддержки обновления и фиксации для наших разработчиков. Для этого им все равно следует использовать TortoiseSVN, но использование обычной команды «svn up workspace» просто удаляет внешнее, поскольку глубина subject2 не является рекурсивной. Повышение уровня глубины до рекурсивного также проверяет (и обновляет et c) родственные папки external .

ATTEMPT

Одним из моих подходов было рекурсивное извлечение subject2 , а затем исключение всех дочерних папок, кроме внешних. Но мне интересно, есть ли другой путь. Так как это означает, что мне нужно извлекать потенциально огромный объем данных, чтобы просто удалить их сразу после. Также может случиться так, что разработчик захочет извлечь внешние и одну из дочерних папок, но не все. Это обязательно вынудит меня сначала проверить все внешние компоненты, а затем добавить внешние папки. Помимо того, что я бы проверял много данных дважды.

Ребята, вы знаете, как обойти это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...