SVN: отслеживание слияний

Можно ли в SVN 1.6 отследить, где был слит коммит? Особенно мне интересны решения на основе пользовательского интерфейса (плагин Eclipse будет отличным).

3 ответа

Решение

Спасибо за все отвеченные лица (особая благодарность derobert и Jim T). Я пишу свой собственный код, используя svnkit 1.2.x, который делает то, что мне нужно.

private static void showMergedRevision(String pFromUrl, String pToUrl) throws SVNException {
    List<String> folders= new ArrayList<String>();
    folders.add("Folder1");
    ...

    SVNRepositoryFactoryImpl.setup();

     String name="user";
     String password="password";

     ISVNOptions options = SVNWCUtil.createDefaultOptions( true );

     ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);

     SVNClientManager ourClientManager = SVNClientManager.newInstance( options , authManager );

     final Set<Long> mergedRevision = new HashSet<Long>();        
     for(String folder : folders){
         SVNURL svnFrom = SVNURL.parseURIDecoded(pFromUrl + "/" + folder);
         SVNURL svnTo = SVNURL.parseURIDecoded(pToUrl+ "/" + folder);
         ISVNLogEntryHandler mergedLogger = new ISVNLogEntryHandler() {
            public void handleLogEntry(SVNLogEntry pParamSVNLogEntry) throws SVNException {
                mergedRevision.add(pParamSVNLogEntry.getRevision());
            }
        };
        ourClientManager.getDiffClient().doGetLogMergedMergeInfo(svnTo, SVNRevision.HEAD, svnFrom, SVNRevision.HEAD, false, null, mergedLogger);
     }

     System.out.println(String.format("Tracking merges from [%s] to [%s].", pFromUrl, pToUrl));
     System.out.println("Comparing folders: " + folders);

     SVNURL svnUrlorg = SVNURL.parseURIDecoded(pFromUrl);
     ISVNLogEntryHandler histroyLogger= new ISVNLogEntryHandler() {
        public void handleLogEntry(SVNLogEntry pParamSVNLogEntry) throws SVNException {
            if (pParamSVNLogEntry.getRevision() < 0){
                // Sometimes got -1 null null null values. Skip them
                return;
            }
            final boolean merged = mergedRevision.contains(pParamSVNLogEntry.getRevision());
            System.out.println(String.format("%s %s: %s %s %s", merged ? "[+]": "[-]", 
                    pParamSVNLogEntry.getRevision(), 
                    pParamSVNLogEntry.getAuthor(), pParamSVNLogEntry.getDate(), 
                    pParamSVNLogEntry.getMessage()));
        }
    }; 
    ourClientManager.getLogClient().doLog(svnUrlorg, null, SVNRevision.HEAD, SVNRevision.create(0), SVNRevision.HEAD, true, false, false, -1, null, histroyLogger);
}

Выход будет:

[-] 7210: боа 03.07.2009
[-] 7211: боа 03.07.2009
[+] 7215: боа 03.07.2009

[+] означает объединенную ревизию, [-] - не объединенную.

Однажды я написал довольно веб-страницу, которая вроде этого сделала. К сожалению, я не могу дать вам страницу, но могу дать вам представление о том, что я сделал.

Сначала наша модель разработки - все разработки сделаны на основе транка, потом ревизии объединяются в различные ветки релиза для разных версий продуктов.

Я настроил веб-страницу с колонкой для каждой версии и строкой для каждой версии ствола. Запустив svn mergeinfo для каждого столбца, я получил список версий ствола, которые были объединены с этой версией.

Таким образом, мы получили нечто очень похожее на те списки сравнения функций, которые вы получаете - таблицу, показывающую черную точку для каждой версии, которая содержала соответствующий транковый коммит.

Выглядело немного так:

rev   |  ver1  |  ver1.1  |  ver2  | ver2.1  |
200   |        |          |        |    X    |
198   |        |    X     |        |    X    |
177   |        |          |        |    X    |
176   |        |          |   X    |    X    |
157   |   X    |    X     |   X    |    X    |
146   |   X    |    X     |   X    |    X    |
122   |   X    |    X     |   X    |    X    |
075   |   X    |    X     |   X    |    X    |

Это позволяет нам точно увидеть, что содержится в каждой версии (полезно для тестирования), а также выделить, были ли какие-либо ревизии объединены в одном месте, но не в другом.

Если вы хотите использовать плагин Eclipse, вы можете попробовать Subclipse. Он действительно прост в использовании и очень полезен для меня при объединении конфликтующих файлов и ветвлений, объединении веток и т. Д. Вот несколько скриншотов.

Другие вопросы по тегам