summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPhilip L. McMahon <philip.l.mcmahon@gmail.com>2012-01-26 21:20:21 -0800
committerPhilip L. McMahon <philip.l.mcmahon@gmail.com>2012-01-26 21:20:21 -0800
commit9129381d7a55c0dfae625b2b07fe1e04409df6a3 (patch)
treea1279af4c506f0e7b89b2e5666f5b1e9ff21dabe /src
parentae0b135ecdbc0e85ba2d612356f4493f2f97bd7a (diff)
downloadgitblit-9129381d7a55c0dfae625b2b07fe1e04409df6a3.tar.gz
gitblit-9129381d7a55c0dfae625b2b07fe1e04409df6a3.zip
Allow administrative modification of the default branch/tag referenced by HEAD.
This allows control over the default branch after clone, which is equivalent to running: git symbolic-ref HEAD refs/heads/mybranch
Diffstat (limited to 'src')
-rw-r--r--src/com/gitblit/GitBlit.java8
-rw-r--r--src/com/gitblit/models/RepositoryModel.java2
-rw-r--r--src/com/gitblit/utils/JGitUtils.java44
-rw-r--r--src/com/gitblit/wicket/GitBlitWebApp.properties2
-rw-r--r--src/com/gitblit/wicket/pages/EditRepositoryPage.html1
-rw-r--r--src/com/gitblit/wicket/pages/EditRepositoryPage.java19
6 files changed, 76 insertions, 0 deletions
diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java
index bf3660d0..b6bf7bf9 100644
--- a/src/com/gitblit/GitBlit.java
+++ b/src/com/gitblit/GitBlit.java
@@ -69,6 +69,7 @@ import com.gitblit.models.FederationModel;
import com.gitblit.models.FederationProposal;
import com.gitblit.models.FederationSet;
import com.gitblit.models.Metric;
+import com.gitblit.models.RefModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.ServerSettings;
import com.gitblit.models.ServerStatus;
@@ -786,6 +787,10 @@ public class GitBlit implements ServletContextListener {
model.mailingLists = new ArrayList<String>(Arrays.asList(config.getStringList(
"gitblit", null, "mailingList")));
}
+ model.defaultHead = JGitUtils.getDefaultHead(r);
+ model.availableHeads = new ArrayList<RefModel>();
+ model.availableHeads.addAll(JGitUtils.getLocalBranches(r, true, -1));
+ model.availableHeads.addAll(JGitUtils.getTags(r, true, -1));
r.close();
return model;
}
@@ -981,6 +986,9 @@ public class GitBlit implements ServletContextListener {
// update settings
if (r != null) {
updateConfiguration(r, repository);
+ if (repository.defaultHead != null) {
+ JGitUtils.setDefaultHead(r, repository.defaultHead.reference);
+ }
r.close();
}
}
diff --git a/src/com/gitblit/models/RepositoryModel.java b/src/com/gitblit/models/RepositoryModel.java
index ad0adaa6..d3e91588 100644
--- a/src/com/gitblit/models/RepositoryModel.java
+++ b/src/com/gitblit/models/RepositoryModel.java
@@ -58,6 +58,8 @@ public class RepositoryModel implements Serializable, Comparable<RepositoryModel
public List<String> preReceiveScripts;
public List<String> postReceiveScripts;
public List<String> mailingLists;
+ public RefModel defaultHead;
+ public List<RefModel> availableHeads;
private String displayName;
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index a540c2aa..0750b078 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -1156,6 +1156,50 @@ public class JGitUtils {
}
/**
+ * Returns the default HEAD for a repository. Normally returns the ref HEAD points to, but if HEAD points to nothing
+ * it returns null.
+ *
+ * @param repository
+ * @return the refmodel for HEAD or null
+ */
+ public static RefModel getDefaultHead(Repository repository) {
+ RefModel ref = null;
+ try {
+ Ref head = repository.getRef(Constants.HEAD);
+ if (head != null) {
+ Ref target = head.getTarget();
+ RevWalk rw = new RevWalk(repository);
+ ObjectId targetId = target.getObjectId();
+ if (targetId != null) {
+ RevObject object = rw.parseAny(targetId);
+ ref = new RefModel(target.getName(), target, object);
+ }
+ rw.dispose();
+ }
+ } catch (Throwable t) {
+ LOGGER.error("Failed to get default head!", t);
+ }
+ return ref;
+ }
+
+ /**
+ * Sets the default HEAD symbolic ref for a repository.
+ *
+ * @param repository
+ * @param ref
+ */
+ 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})",
+ repository.getDirectory().getAbsolutePath(), ref.getName(), result));
+ } catch (IOException e) {
+ LOGGER.error("Failed to set default head!", e);
+ }
+ }
+
+ /**
* Returns all refs grouped by their associated object id.
*
* @param repository
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties
index 713fee70..b6e45236 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -131,6 +131,8 @@ gb.registrations = federation registrations
gb.sendProposal propose
gb.status = status
gb.origin = origin
+gb.defaultHead = default head
+gb.defaultHeadDescription = current branch after clone. e.g. refs/heads/master
gb.federationStrategy = federation strategy
gb.federationRegistration = federation registration
gb.federationResults = federation pull results
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.html b/src/com/gitblit/wicket/pages/EditRepositoryPage.html
index d282d103..98789304 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.html
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.html
@@ -14,6 +14,7 @@
<tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="name" id="name" size="40" tabindex="1" /> &nbsp;<span class="help-inline"><wicket:message key="gb.nameDescription"></wicket:message></span></td></tr>
<tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="description" size="40" tabindex="2" /></td></tr>
<tr><th><wicket:message key="gb.origin"></wicket:message></th><td class="edit"><input class="span7" type="text" wicket:id="origin" size="80" tabindex="3" /></td></tr>
+ <tr><th><wicket:message key="gb.defaultHead"></wicket:message></th><td class="edit"><select wicket:id="defaultHead" /> &nbsp;<span class="help-inline"><wicket:message key="gb.defaultHeadDescription"></wicket:message></span></td></tr>
<tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select wicket:id="owner" tabindex="4" /> &nbsp;<span class="help-inline"><wicket:message key="gb.ownerDescription"></wicket:message></span></td></tr>
<tr><th><wicket:message key="gb.enableTickets"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="5" /> &nbsp;<span class="help-inline"><wicket:message key="gb.useTicketsDescription"></wicket:message></span></td></tr>
<tr><th><wicket:message key="gb.enableDocs"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="6" /> &nbsp;<span class="help-inline"><wicket:message key="gb.useDocsDescription"></wicket:message></span></td></tr>
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
index 7d2d64c8..6c042497 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -45,6 +45,7 @@ import com.gitblit.Constants.FederationStrategy;
import com.gitblit.GitBlit;
import com.gitblit.GitBlitException;
import com.gitblit.Keys;
+import com.gitblit.models.RefModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ArrayUtils;
@@ -271,6 +272,9 @@ public class EditRepositoryPage extends RootSubPage {
form.add(new CheckBox("isFrozen"));
// TODO enable origin definition
form.add(new TextField<String>("origin").setEnabled(false/* isCreate */));
+ // enable alteration of the default branch after clone
+ form.add(new DropDownChoice<RefModel>("defaultHead", repositoryModel.availableHeads,
+ new RefModelRenderer()).setEnabled(GitBlitWebSession.get().canAdmin()));
// federation strategies - remove ORIGIN choice if this repository has
// no origin.
@@ -361,6 +365,21 @@ public class EditRepositoryPage extends RootSubPage {
}
}
+ private class RefModelRenderer implements IChoiceRenderer<RefModel> {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public String getDisplayValue(RefModel type) {
+ return type.displayName;
+ }
+
+ @Override
+ public String getIdValue(RefModel type, int index) {
+ return type.getName();
+ }
+ }
+
private class AccessRestrictionRenderer implements IChoiceRenderer<AccessRestrictionType> {
private static final long serialVersionUID = 1L;