From d62d883423c4f13e9514c203d2f0b14e4715df7f Mon Sep 17 00:00:00 2001 From: James Moger Date: Fri, 23 May 2014 09:01:28 -0400 Subject: [PATCH] Tag server-side merges when incremental push tags are enabled --- releases.moxie | 2 + .../com/gitblit/git/GitblitReceivePack.java | 144 +++++++++++------- .../com/gitblit/git/PatchsetReceivePack.java | 8 +- 3 files changed, 93 insertions(+), 61 deletions(-) diff --git a/releases.moxie b/releases.moxie index afd1d8e8..1ca462ea 100644 --- a/releases.moxie +++ b/releases.moxie @@ -34,6 +34,7 @@ r24: { - Add object type (ot) parameter for RSS queries to retrieve tag details (pr-165, ticket-66) - Add setting to allow STARTTLS without requiring SMTPS (pr-183) - Added an extension point for monitoring onStartup and onShutdown (ticket-79) + - Tag server-side merges when incremental push tags are enabled (issue-432, ticket-85) dependencyChanges: - Update to javax.mail 1.5.1 (issue-417, ticket-58) contributors: @@ -45,6 +46,7 @@ r24: { - Berke Viktor - Marcus Hunger - Matthias Cullmann + - Emmeran Seehuber settings: - { name: 'web.allowDeletingNonEmptyRepositories', defaultValue: 'true' } - { name: 'mail.starttls', defaultValue: 'false' } diff --git a/src/main/java/com/gitblit/git/GitblitReceivePack.java b/src/main/java/com/gitblit/git/GitblitReceivePack.java index b4449f06..34bbea27 100644 --- a/src/main/java/com/gitblit/git/GitblitReceivePack.java +++ b/src/main/java/com/gitblit/git/GitblitReceivePack.java @@ -331,6 +331,43 @@ public class GitblitReceivePack extends ReceivePack implements PreReceiveHook, P return; } + logRefChange(commands); + updateIncrementalPushTags(commands); + updateGitblitRefLog(commands); + + // check for updates pushed to the BranchTicketService branch + // if the BranchTicketService is active it will reindex, as appropriate + for (ReceiveCommand cmd : commands) { + if (Result.OK.equals(cmd.getResult()) + && BranchTicketService.BRANCH.equals(cmd.getRefName())) { + rp.getRepository().fireEvent(new ReceiveCommandEvent(repository, cmd)); + } + } + + // call post-receive plugins + for (ReceiveHook hook : gitblit.getExtensions(ReceiveHook.class)) { + try { + hook.onPostReceive(this, commands); + } catch (Exception e) { + LOGGER.error("Failed to execute extension", e); + } + } + + // run Groovy hook scripts + Set scripts = new LinkedHashSet(); + scripts.addAll(gitblit.getPostReceiveScriptsInherited(repository)); + if (!ArrayUtils.isEmpty(repository.postReceiveScripts)) { + scripts.addAll(repository.postReceiveScripts); + } + runGroovy(commands, scripts); + } + + /** + * Log the ref changes in the container log. + * + * @param commands + */ + protected void logRefChange(Collection commands) { boolean isRefCreationOrDeletion = false; // log ref changes @@ -362,76 +399,65 @@ public class GitblitReceivePack extends ReceivePack implements PreReceiveHook, P if (isRefCreationOrDeletion) { gitblit.resetRepositoryCache(repository.name); } + } - if (repository.useIncrementalPushTags) { - // tag each pushed branch tip - String emailAddress = user.emailAddress == null ? rp.getRefLogIdent().getEmailAddress() : user.emailAddress; - PersonIdent userIdent = new PersonIdent(user.getDisplayName(), emailAddress); - - for (ReceiveCommand cmd : commands) { - if (!cmd.getRefName().startsWith(Constants.R_HEADS)) { - // only tag branch ref changes - continue; - } - - if (!ReceiveCommand.Type.DELETE.equals(cmd.getType()) - && ReceiveCommand.Result.OK.equals(cmd.getResult())) { - String objectId = cmd.getNewId().getName(); - String branch = cmd.getRefName().substring(Constants.R_HEADS.length()); - // get translation based on the server's locale setting - String template = Translation.get("gb.incrementalPushTagMessage"); - String msg = MessageFormat.format(template, branch); - String prefix; - if (StringUtils.isEmpty(repository.incrementalPushTagPrefix)) { - prefix = settings.getString(Keys.git.defaultIncrementalPushTagPrefix, "r"); - } else { - prefix = repository.incrementalPushTagPrefix; - } - - JGitUtils.createIncrementalRevisionTag( - rp.getRepository(), - objectId, - userIdent, - prefix, - "0", - msg); - } - } + /** + * Optionally update the incremental push tags. + * + * @param commands + */ + protected void updateIncrementalPushTags(Collection commands) { + if (!repository.useIncrementalPushTags) { + return; } - // update push log - try { - RefLogUtils.updateRefLog(user, rp.getRepository(), commands); - LOGGER.debug(MessageFormat.format("{0} push log updated", repository.name)); - } catch (Exception e) { - LOGGER.error(MessageFormat.format("Failed to update {0} pushlog", repository.name), e); - } + // tag each pushed branch tip + String emailAddress = user.emailAddress == null ? getRefLogIdent().getEmailAddress() : user.emailAddress; + PersonIdent userIdent = new PersonIdent(user.getDisplayName(), emailAddress); - // check for updates pushed to the BranchTicketService branch - // if the BranchTicketService is active it will reindex, as appropriate for (ReceiveCommand cmd : commands) { - if (Result.OK.equals(cmd.getResult()) - && BranchTicketService.BRANCH.equals(cmd.getRefName())) { - rp.getRepository().fireEvent(new ReceiveCommandEvent(repository, cmd)); + if (!cmd.getRefName().startsWith(Constants.R_HEADS)) { + // only tag branch ref changes + continue; } - } - // call post-receive plugins - for (ReceiveHook hook : gitblit.getExtensions(ReceiveHook.class)) { - try { - hook.onPostReceive(this, commands); - } catch (Exception e) { - LOGGER.error("Failed to execute extension", e); + if (!ReceiveCommand.Type.DELETE.equals(cmd.getType()) + && ReceiveCommand.Result.OK.equals(cmd.getResult())) { + String objectId = cmd.getNewId().getName(); + String branch = cmd.getRefName().substring(Constants.R_HEADS.length()); + // get translation based on the server's locale setting + String template = Translation.get("gb.incrementalPushTagMessage"); + String msg = MessageFormat.format(template, branch); + String prefix; + if (StringUtils.isEmpty(repository.incrementalPushTagPrefix)) { + prefix = settings.getString(Keys.git.defaultIncrementalPushTagPrefix, "r"); + } else { + prefix = repository.incrementalPushTagPrefix; + } + + JGitUtils.createIncrementalRevisionTag( + getRepository(), + objectId, + userIdent, + prefix, + "0", + msg); } } + } - // run Groovy hook scripts - Set scripts = new LinkedHashSet(); - scripts.addAll(gitblit.getPostReceiveScriptsInherited(repository)); - if (!ArrayUtils.isEmpty(repository.postReceiveScripts)) { - scripts.addAll(repository.postReceiveScripts); + /** + * Update Gitblit's internal reflog. + * + * @param commands + */ + protected void updateGitblitRefLog(Collection commands) { + try { + RefLogUtils.updateRefLog(user, getRepository(), commands); + LOGGER.debug(MessageFormat.format("{0} reflog updated", repository.name)); + } catch (Exception e) { + LOGGER.error(MessageFormat.format("Failed to update {0} reflog", repository.name), e); } - runGroovy(commands, scripts); } /** Execute commands to update references. */ diff --git a/src/main/java/com/gitblit/git/PatchsetReceivePack.java b/src/main/java/com/gitblit/git/PatchsetReceivePack.java index f7412a34..9e55524d 100644 --- a/src/main/java/com/gitblit/git/PatchsetReceivePack.java +++ b/src/main/java/com/gitblit/git/PatchsetReceivePack.java @@ -1202,11 +1202,15 @@ public class PatchsetReceivePack extends GitblitReceivePack { if (ticket != null) { ticketNotifier.queueMailing(ticket); - // update the reflog with the merge if (oldRef != null) { ReceiveCommand cmd = new ReceiveCommand(oldRef.getObjectId(), ObjectId.fromString(mergeResult.sha), oldRef.getName()); - RefLogUtils.updateRefLog(user, getRepository(), Arrays.asList(cmd)); + cmd.setResult(Result.OK); + List commands = Arrays.asList(cmd); + + logRefChange(commands); + updateIncrementalPushTags(commands); + updateGitblitRefLog(commands); } // call patchset hooks -- 2.39.5