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. Он действительно прост в использовании и очень полезен для меня при объединении конфликтующих файлов и ветвлений, объединении веток и т. Д. Вот несколько скриншотов.