summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/gitblit/wicket/pages/EditFilePage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/gitblit/wicket/pages/EditFilePage.java')
-rw-r--r--src/main/java/com/gitblit/wicket/pages/EditFilePage.java220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/main/java/com/gitblit/wicket/pages/EditFilePage.java b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java
new file mode 100644
index 00000000..378f2a35
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2016 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.pages;
+
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.link.ExternalLink;
+import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.model.Model;
+import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheBuilder;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+import com.gitblit.Constants;
+import com.gitblit.models.UserModel;
+import com.gitblit.servlet.RawServlet;
+import com.gitblit.utils.BugtraqProcessor;
+import com.gitblit.utils.JGitUtils;
+import com.gitblit.utils.StringUtils;
+import com.gitblit.wicket.CacheControl;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.CacheControl.LastModified;
+import com.gitblit.wicket.MarkupProcessor;
+import com.gitblit.wicket.MarkupProcessor.MarkupDocument;
+import com.gitblit.wicket.WicketUtils;
+
+@CacheControl(LastModified.BOOT)
+public class EditFilePage extends RepositoryPage {
+
+ public EditFilePage(final PageParameters params) {
+ super(params);
+
+ final UserModel currentUser = (GitBlitWebSession.get().getUser() != null) ? GitBlitWebSession.get().getUser() : UserModel.ANONYMOUS;
+
+ final String path = WicketUtils.getPath(params).replace("%2f", "/").replace("%2F", "/");
+ MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter());
+
+ Repository r = getRepository();
+ RevCommit commit = JGitUtils.getCommit(r, objectId);
+ String [] encodings = getEncodings();
+
+ // Read raw markup content and transform it to html
+ String documentPath = path;
+ String markupText = JGitUtils.getStringContent(r, commit.getTree(), path, encodings);
+
+ // Hunt for document
+ if (StringUtils.isEmpty(markupText)) {
+ String name = StringUtils.stripFileExtension(path);
+
+ List<String> docExtensions = processor.getAllExtensions();
+ for (String ext : docExtensions) {
+ String checkName = name + "." + ext;
+ markupText = JGitUtils.getStringContent(r, commit.getTree(), checkName, encodings);
+ if (!StringUtils.isEmpty(markupText)) {
+ // found it
+ documentPath = path;
+ break;
+ }
+ }
+ }
+
+ if (markupText == null) {
+ markupText = "";
+ }
+
+ BugtraqProcessor bugtraq = new BugtraqProcessor(app().settings());
+ markupText = bugtraq.processText(getRepository(), repositoryName, markupText);
+
+ Fragment fragment;
+ String displayedCommitId = commit.getId().getName();
+ MarkupDocument markupDoc = processor.parse(repositoryName, displayedCommitId, documentPath, markupText);
+ logger.info("Loading Edit File page: " + displayedCommitId);
+
+ if (currentUser.canEdit(getRepositoryModel())) {
+
+ final Model<String> documentContent = new Model<String>(markupDoc.markup);
+ final Model<String> commitMessage = new Model<String>("Document update");
+ final Model<String> commitIdAtLoad = new Model<String>(displayedCommitId);
+
+ fragment = new Fragment("doc", "markupContent", this);
+
+ Form<Void> form = new Form<Void>("documentEditor") {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onSubmit() {
+
+ final Repository repository = getRepository();
+ final String document = documentContent.getObject();
+ final String message = commitMessage.getObject();
+
+ final String branchName = JGitUtils.getBranch(getRepository(), objectId).getName();
+ final String authorEmail = StringUtils.isEmpty(currentUser.emailAddress) ? (currentUser.username + "@gitblit") : currentUser.emailAddress;
+
+ boolean success = false;
+
+ try {
+ ObjectId docAtLoad = getRepository().resolve(commitIdAtLoad.getObject());
+
+ logger.info("Commiting Edit File page: " + commitIdAtLoad.getObject());
+
+ DirCache index = DirCache.newInCore();
+ DirCacheBuilder builder = index.builder();
+ byte[] bytes = document.getBytes( Constants.ENCODING );
+
+ final DirCacheEntry fileUpdate = new DirCacheEntry(path);
+ fileUpdate.setLength(bytes.length);
+ fileUpdate.setLastModified(System.currentTimeMillis());
+ fileUpdate.setFileMode(FileMode.REGULAR_FILE);
+ fileUpdate.setObjectId(repository.newObjectInserter().insert( org.eclipse.jgit.lib.Constants.OBJ_BLOB, bytes ));
+ builder.add(fileUpdate);
+
+ Set<String> ignorePaths = new HashSet<String>();
+ ignorePaths.add(path);
+
+ for (DirCacheEntry entry : JGitUtils.getTreeEntries(repository, branchName, ignorePaths)) {
+ builder.add(entry);
+ }
+
+ builder.finish();
+
+ final boolean forceCommit = false;
+
+ success = JGitUtils.commitIndex(repository, branchName, index, docAtLoad, forceCommit, currentUser.getDisplayName(), authorEmail, message);
+
+ } catch (IOException | ConcurrentRefUpdateException e) {
+ e.printStackTrace();
+ }
+
+ if (success == false) {
+ EditFilePage.this.error("Unable to commit document " + path, false);
+ return;
+ }
+
+ setResponsePage(EditFilePage.class, params);
+ return;
+ }
+ };
+
+ final TextArea<String> docIO = new TextArea<String>("content", documentContent);
+ docIO.setOutputMarkupId(false);
+
+ form.add(new Label("commitAuthor", String.format("%s <%s>", currentUser.getDisplayName(), currentUser.emailAddress)));
+ form.add(new TextArea<String>("commitMessage", commitMessage));
+
+
+ form.setOutputMarkupId(false);
+ form.add(docIO);
+
+ addBottomScriptInline("attachDocumentEditor(document.querySelector('textarea#editor'), $('#commitDialog'));");
+
+ fragment.add(form);
+
+ } else {
+
+ final Model<String> documentContent = new Model<String>(markupDoc.html);
+
+ fragment = new Fragment("doc", "plainContent", this);
+
+ fragment.add(new Label("content", documentContent).setEscapeModelStrings(false));
+ }
+
+ // document page links
+ fragment.add(new BookmarkablePageLink<Void>("blameLink", BlamePage.class,
+ WicketUtils.newPathParameter(repositoryName, objectId, documentPath)));
+ fragment.add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
+ WicketUtils.newPathParameter(repositoryName, objectId, documentPath)));
+ String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, objectId, documentPath);
+ fragment.add(new ExternalLink("rawLink", rawUrl));
+
+ add(fragment);
+
+ }
+
+ @Override
+ protected String getPageName() {
+ return getString("gb.docs");
+ }
+
+ @Override
+ protected boolean isCommitPage() {
+ return true;
+ }
+
+ @Override
+ protected Class<? extends BasePage> getRepoNavPageClass() {
+ return DocsPage.class;
+ }
+
+
+
+}