Philip L. McMahon
2012-01-27 30f9d25d77ccb5cd978d4cf8fa389ec819e90e95
Correct update of HEAD symbolic reference when target is a tag.

Revised update results which are considered successful and improved error
messaging.
1 files modified
26 ■■■■ changed files
src/com/gitblit/utils/JGitUtils.java 26 ●●●● patch | view | raw | blame | history
src/com/gitblit/utils/JGitUtils.java
@@ -1190,12 +1190,28 @@
     */
    public static void setDefaultHead(Repository repository, Ref ref) {
        try {
            RefUpdate head = repository.updateRef(Constants.HEAD);
            RefUpdate.Result result = head.link(ref.getName());
            LOGGER.debug(MessageFormat.format("Set repository {0} default head to {1} ({2})",
            boolean detach = !ref.getName().startsWith(Constants.R_HEADS); // detach if not a branch
            RefUpdate.Result result;
            RefUpdate head = repository.updateRef(Constants.HEAD, detach);
            if (detach) { // Tag
                RevCommit commit = getCommit(repository, ref.getObjectId().getName());
                head.setNewObjectId(commit.getId());
                result = head.forceUpdate();
            } else {
                result = head.link(ref.getName());
            }
            switch (result) {
            case NEW:
            case FORCED:
            case NO_CHANGE:
            case FAST_FORWARD:
                break;
            default:
                LOGGER.error(MessageFormat.format("{0} failed to set default head to {1} ({2})",
                    repository.getDirectory().getAbsolutePath(), ref.getName(), result));
        } catch (IOException e) {
            LOGGER.error("Failed to set default head!", e);
            }
        } catch (Throwable t) {
            error(t, repository, "{0} failed to set default head to {1}", ref.getName());
        }
    }