Skip to content

Commit 0047fbb

Browse files
committedJun 3, 2014
Simplified repository creation with a NewRepositoryPage
1 parent e1bcda8 commit 0047fbb

16 files changed

+674
-15
lines changed
 

‎.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "src/main/distrib/data/gitignore"]
2+
path = src/main/distrib/data/gitignore
3+
url = https://github.com/github/gitignore.git

‎build.xml

+6
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,12 @@
919919
<include name="subgit.groovy" />
920920
</fileset>
921921
</copy>
922+
<mkdir dir="@{toDir}/gitignore" />
923+
<copy todir="@{toDir}/gitignore">
924+
<fileset dir="${project.distrib.dir}/data/gitignore">
925+
<include name="*.gitignore" />
926+
</fileset>
927+
</copy>
922928
</sequential>
923929
</macrodef>
924930

‎releases.moxie

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ r24: {
3636
- Add FORK_REPOSITORY RPC request type (issue-371, pr-161, ticket-65)
3737
- Add object type (ot) parameter for RSS queries to retrieve tag details (pr-165, ticket-66)
3838
- Add setting to allow STARTTLS without requiring SMTPS (pr-183)
39+
- Simplified repository creation, offer simple README generation, and insertion of a pre-defined .gitignore file (ticket-76)
3940
- Added an extension point for monitoring onStartup and onShutdown (ticket-79)
4041
- Tag server-side merges when incremental push tags are enabled (issue-432, ticket-85)
4142
- Add setting to control default thread pool size for miscellaneous background tasks (ticket-92)
@@ -55,6 +56,7 @@ r24: {
5556
- { name: 'web.allowDeletingNonEmptyRepositories', defaultValue: 'true' }
5657
- { name: 'mail.starttls', defaultValue: 'false' }
5758
- { name: 'execution.defaultThreadPoolSize', defaultValue: '1' }
59+
- { name: 'git.gitignoreFolder', defaultValue: '${baseFolder}/gitignore' }
5860
}
5961

6062
#

‎src/main/distrib/data/gitblit.properties

+5
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,11 @@ git.defaultIncrementalPushTagPrefix = r
271271
# SINCE 1.4.0
272272
git.createRepositoriesShared = false
273273

274+
# Directory for gitignore templates used during repository creation.
275+
#
276+
# SINCE 1.6.0
277+
git.gitignoreFolder = ${baseFolder}/gitignore
278+
274279
# Enable JGit-based garbage collection. (!!EXPERIMENTAL!!)
275280
#
276281
# USE AT YOUR OWN RISK!

‎src/main/distrib/data/gitignore

Submodule gitignore added at 097db81

‎src/main/java/com/gitblit/Constants.java

+8
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ public class Constants {
122122

123123
public static final String R_TICKETS_PATCHSETS = "refs/tickets/";
124124

125+
public static final String R_MASTER = "refs/heads/master";
126+
127+
public static final String MASTER = "master";
128+
129+
public static final String R_DEVELOP = "refs/heads/develop";
130+
131+
public static final String DEVELOP = "develop";
132+
125133
public static String getVersion() {
126134
String v = Constants.class.getPackage().getImplementationVersion();
127135
if (v == null) {

‎src/main/java/com/gitblit/servlet/GitblitContext.java

+16
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,22 @@ private File configureExpress(
372372
}
373373
}
374374

375+
// Copy the included gitignore files to the configured gitignore folder
376+
String gitignorePath = webxmlSettings.getString(Keys.git.gitignoreFolder, "gitignore");
377+
File localGitignores = com.gitblit.utils.FileUtils.resolveParameter(Constants.baseFolder$, base, gitignorePath);
378+
if (!localGitignores.exists()) {
379+
File warGitignores = new File(contextFolder, "/WEB-INF/data/gitignore");
380+
if (!warGitignores.equals(localGitignores)) {
381+
try {
382+
com.gitblit.utils.FileUtils.copy(localGitignores, warGitignores.listFiles());
383+
} catch (IOException e) {
384+
logger.error(MessageFormat.format(
385+
"Failed to copy included .gitignore files from {0} to {1}",
386+
warGitignores, localGitignores));
387+
}
388+
}
389+
}
390+
375391
// merge the WebXmlSettings into the runtime settings (for backwards-compatibilty)
376392
runtimeSettings.merge(webxmlSettings);
377393

‎src/main/java/com/gitblit/wicket/GitBlitWebApp.java

+10
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import com.gitblit.wicket.pages.DocPage;
5858
import com.gitblit.wicket.pages.DocsPage;
5959
import com.gitblit.wicket.pages.EditMilestonePage;
60+
import com.gitblit.wicket.pages.EditRepositoryPage;
6061
import com.gitblit.wicket.pages.EditTicketPage;
6162
import com.gitblit.wicket.pages.ExportTicketPage;
6263
import com.gitblit.wicket.pages.FederationRegistrationPage;
@@ -71,6 +72,7 @@
7172
import com.gitblit.wicket.pages.MyDashboardPage;
7273
import com.gitblit.wicket.pages.MyTicketsPage;
7374
import com.gitblit.wicket.pages.NewMilestonePage;
75+
import com.gitblit.wicket.pages.NewRepositoryPage;
7476
import com.gitblit.wicket.pages.NewTicketPage;
7577
import com.gitblit.wicket.pages.OverviewPage;
7678
import com.gitblit.wicket.pages.PatchPage;
@@ -92,6 +94,8 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
9294

9395
private final Class<? extends WebPage> homePageClass = MyDashboardPage.class;
9496

97+
private final Class<? extends WebPage> newRepositoryPageClass = NewRepositoryPage.class;
98+
9599
private final Map<String, CacheControl> cacheablePages = new HashMap<String, CacheControl>();
96100

97101
private final IStoredSettings settings;
@@ -207,6 +211,8 @@ public void init() {
207211
mount("/proposal", ReviewProposalPage.class, "t");
208212
mount("/registration", FederationRegistrationPage.class, "u", "n");
209213

214+
mount("/new", NewRepositoryPage.class);
215+
mount("/edit", EditRepositoryPage.class, "r");
210216
mount("/activity", ActivityPage.class, "r", "h");
211217
mount("/lucene", LuceneSearchPage.class);
212218
mount("/project", ProjectPage.class, "p");
@@ -262,6 +268,10 @@ public Class<? extends WebPage> getHomePage() {
262268
return homePageClass;
263269
}
264270

271+
public Class<? extends WebPage> getNewRepositoryPage() {
272+
return newRepositoryPageClass;
273+
}
274+
265275
/* (non-Javadoc)
266276
* @see com.gitblit.wicket.Webapp#isCacheablePage(java.lang.String)
267277
*/

‎src/main/java/com/gitblit/wicket/GitBlitWebApp.properties

+16-1
Original file line numberDiff line numberDiff line change
@@ -685,4 +685,19 @@ gb.closedMilestones = closed milestones
685685
gb.administration = administration
686686
gb.plugins = plugins
687687
gb.extensions = extensions
688-
688+
gb.anonymous = Anonymous
689+
gb.anonymousRepoDescription = Anyone can see, clone, and push to this repository.
690+
gb.public = Public
691+
gb.publicRepoDescription = Anyone can see and clone this repository. You choose who can push.
692+
gb.protected = Protected
693+
gb.protectedRepoDescription = Anyone can see this repository. You choose who can clone and push.
694+
gb.private = Private
695+
gb.privateRepoDescription = You choose who can see, clone, and push to this repository.
696+
gb.initialCommit = Initial Commit
697+
gb.initialCommitDescription = This will allow you to <code>git clone</code> this repository immediately. Skip this step if you have already run <code>git init</code> locally.
698+
gb.initWithReadme = Include a README
699+
gb.initWithReadmeDescription = This will generate a simple README document for your repository.
700+
gb.initWithGitignore = Include a .gitignore file
701+
gb.initWithGitignoreDescription = This will insert a config file that instructs your Git clients to ignore files or directories that match defined patterns.
702+
gb.initWithGitflow = Include a .gitflow file
703+
gb.initWithGitflowDescription = This will generate a config file which guides Git clients in setting up Gitflow branches.

‎src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -429,11 +429,7 @@ protected void onSubmit() {
429429
return;
430430
}
431431
setRedirect(false);
432-
if (isCreate) {
433-
setResponsePage(RepositoriesPage.class);
434-
} else {
435-
setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name));
436-
}
432+
setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name));
437433
}
438434
};
439435

@@ -632,7 +628,15 @@ public void onClick() {
632628
if (canDelete) {
633629
if (app().repositories().deleteRepositoryModel(latestModel)) {
634630
info(MessageFormat.format(getString("gb.repositoryDeleted"), latestModel));
635-
setResponsePage(RepositoriesPage.class);
631+
if (latestModel.isPersonalRepository()) {
632+
// redirect to user's profile page
633+
String prefix = app().settings().getString(Keys.git.userRepositoryPrefix, "~");
634+
String username = latestModel.projectPath.substring(prefix.length());
635+
setResponsePage(UserPage.class, WicketUtils.newUsernameParameter(username));
636+
} else {
637+
// redirect to server repositories page
638+
setResponsePage(RepositoriesPage.class);
639+
}
636640
} else {
637641
error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), latestModel));
638642
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2+
<html xmlns="http://www.w3.org/1999/xhtml"
3+
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
4+
xml:lang="en"
5+
lang="en">
6+
7+
<wicket:extend>
8+
<body onload="document.getElementById('name').focus();">
9+
<form style="padding-top:5px;" wicket:id="editForm">
10+
<div class="row">
11+
<div class="span12">
12+
13+
<table class="plain">
14+
<tbody class="settings">
15+
<tr>
16+
<th><wicket:message key="gb.project"></wicket:message></th>
17+
<td></td>
18+
<th><wicket:message key="gb.name"></wicket:message></th>
19+
</tr>
20+
<tr>
21+
<td><select class="span2" wicket:id="projectPath" /></td>
22+
<td style="font-size:24px;color:#ccc;">/</td>
23+
<td class="edit"><input class="span3" type="text" wicket:id="name" id="name" /> &nbsp;<span class="help-inline"><wicket:message key="gb.nameDescription"></wicket:message></span></td>
24+
</tr>
25+
</tbody>
26+
</table>
27+
28+
<div>
29+
<b><wicket:message key="gb.description"></wicket:message></b><br/>
30+
<input class="span6" type="text" wicket:id="description" />
31+
</div>
32+
33+
<hr/>
34+
35+
<span wicket:id="permissionsGroup">
36+
<div wicket:id="permissions">
37+
<div style="display: inline-block;vertical-align: top;">
38+
<input type="radio" wicket:id="radio" />
39+
<img wicket:id="image"></img>
40+
</div>
41+
<div style="display: inline-block;vertical-align: top;">
42+
<b><span wicket:id="name"></span></b><br/>
43+
<span wicket:id="description"></span>
44+
</div>
45+
</div>
46+
</span>
47+
48+
<hr/>
49+
50+
<h4><wicket:message key="gb.initialCommit"></wicket:message></h4>
51+
<div>
52+
<p><wicket:message key="gb.initialCommitDescription"></wicket:message></p>
53+
</div>
54+
55+
<div style="clear:both;padding-top:10px;">
56+
<div style="display: inline-block;vertical-align: top;">
57+
<input type="checkbox" wicket:id="addReadme" />
58+
</div>
59+
<div style="display: inline-block;">
60+
<b><wicket:message key="gb.initWithReadme"></wicket:message></b><br/>
61+
<p><wicket:message key="gb.initWithReadmeDescription"></wicket:message></p>
62+
</div>
63+
</div>
64+
65+
<div style="clear:both;padding-top:10px;display:none;">
66+
<!-- future GitFlow -->
67+
<div style="display: inline-block;vertical-align: top;">
68+
<input type="checkbox" wicket:id="addGitflow" />
69+
</div>
70+
<div style="display: inline-block;">
71+
<b><wicket:message key="gb.initWithGitflow"></wicket:message></b>
72+
<p><wicket:message key="gb.initWithGitflowDescription"></wicket:message></p>
73+
</div>
74+
</div>
75+
76+
<div style="clear:both;padding-top:10px;">
77+
<div style="display: inline-block;vertical-align: top;">
78+
<input type="checkbox" wicket:id="addGitignore" />
79+
</div>
80+
<div style="display:inline-block;">
81+
<b><wicket:message key="gb.initWithGitignore"></wicket:message></b><br/>
82+
<p><wicket:message key="gb.initWithGitignoreDescription"></wicket:message></p>
83+
<p style="padding-top:5px;"><select class="span2" wicket:id="gitignore" /></p>
84+
</div>
85+
</div>
86+
</div>
87+
</div>
88+
89+
<div class="row">
90+
<div class="span12">
91+
<div class="form-actions"><input class="btn btn-appmenu" type="submit" value="Create" wicket:message="value:gb.create" wicket:id="create" /></div>
92+
</div>
93+
</div>
94+
95+
</form>
96+
</body>
97+
</wicket:extend>
98+
</html>

‎src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java

+493
Large diffs are not rendered by default.

‎src/main/java/com/gitblit/wicket/pages/RootPage.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ protected void onInitialize() {
607607
List<MenuItem> standardItems = new ArrayList<MenuItem>();
608608
standardItems.add(new MenuDivider());
609609
if (user.canAdmin() || user.canCreate()) {
610-
standardItems.add(new PageLinkMenuItem("gb.newRepository", EditRepositoryPage.class));
610+
standardItems.add(new PageLinkMenuItem("gb.newRepository", app().getNewRepositoryPage()));
611611
}
612612
standardItems.add(new PageLinkMenuItem("gb.myProfile", UserPage.class,
613613
WicketUtils.newUsernameParameter(user.username)));

‎src/main/java/com/gitblit/wicket/pages/UserPage.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030

3131
import com.gitblit.Keys;
3232
import com.gitblit.models.Menu.ParameterMenuItem;
33-
import com.gitblit.models.NavLink.DropDownPageMenuNavLink;
3433
import com.gitblit.models.NavLink;
34+
import com.gitblit.models.NavLink.DropDownPageMenuNavLink;
3535
import com.gitblit.models.ProjectModel;
3636
import com.gitblit.models.RepositoryModel;
3737
import com.gitblit.models.UserModel;
@@ -95,7 +95,7 @@ private void setup(PageParameters params) {
9595
UserModel sessionUser = GitBlitWebSession.get().getUser();
9696
if (sessionUser != null && user.canCreate() && sessionUser.equals(user)) {
9797
// user can create personal repositories
98-
add(new BookmarkablePageLink<Void>("newRepository", EditRepositoryPage.class));
98+
add(new BookmarkablePageLink<Void>("newRepository", app().getNewRepositoryPage()));
9999
} else {
100100
add(new Label("newRepository").setVisible(false));
101101
}

‎src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import com.gitblit.wicket.WicketUtils;
3434
import com.gitblit.wicket.freemarker.FreemarkerPanel;
3535
import com.gitblit.wicket.ng.NgController;
36-
import com.gitblit.wicket.pages.EditRepositoryPage;
3736

3837
/**
3938
* A client-side filterable rich repository list which uses Freemarker, Wicket,
@@ -98,7 +97,7 @@ protected void onInitialize() {
9897
}
9998

10099
if (allowCreate) {
101-
panel.add(new LinkPanel(ngList + "Button", "btn btn-mini", getString("gb.newRepository"), EditRepositoryPage.class));
100+
panel.add(new LinkPanel(ngList + "Button", "btn btn-mini", getString("gb.newRepository"), app().getNewRepositoryPage()));
102101
} else {
103102
panel.add(new Label(ngList + "Button").setVisible(false));
104103
}

‎src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import com.gitblit.wicket.GitBlitWebSession;
5252
import com.gitblit.wicket.WicketUtils;
5353
import com.gitblit.wicket.pages.BasePage;
54-
import com.gitblit.wicket.pages.EditRepositoryPage;
5554
import com.gitblit.wicket.pages.ProjectPage;
5655
import com.gitblit.wicket.pages.RepositoriesPage;
5756
import com.gitblit.wicket.pages.SummaryPage;
@@ -87,12 +86,12 @@ public void onClick() {
8786
setResponsePage(RepositoriesPage.class);
8887
}
8988
}.setVisible(app().settings().getBoolean(Keys.git.cacheRepositoryList, true)));
90-
managementLinks.add(new BookmarkablePageLink<Void>("newRepository", EditRepositoryPage.class));
89+
managementLinks.add(new BookmarkablePageLink<Void>("newRepository", app().getNewRepositoryPage()));
9190
add(managementLinks);
9291
} else if (showManagement && user != null && user.canCreate()) {
9392
// user can create personal repositories
9493
managementLinks = new Fragment("managementPanel", "personalLinks", this);
95-
managementLinks.add(new BookmarkablePageLink<Void>("newRepository", EditRepositoryPage.class));
94+
managementLinks.add(new BookmarkablePageLink<Void>("newRepository", app().getNewRepositoryPage()));
9695
add(managementLinks);
9796
} else {
9897
// user has no management permissions

0 commit comments

Comments
 (0)
Please sign in to comment.