Skip to content

Commit 68d5a2e

Browse files
committed
Reset and diff added
1 parent c3d3d88 commit 68d5a2e

File tree

2 files changed

+117
-20
lines changed

2 files changed

+117
-20
lines changed

app/src/processing/app/Editor.java

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ public boolean test(Sketch sketch) {
161161

162162
static volatile AbstractMonitor serialMonitor;
163163
static AbstractMonitor serialPlotter;
164-
164+
165165
final EditorHeader header;
166166
EditorStatus status;
167167
EditorConsole console;
@@ -257,7 +257,7 @@ public void windowDeactivated(WindowEvent e) {
257257

258258
//PdeKeywords keywords = new PdeKeywords();
259259
//sketchbook = new Sketchbook(this);
260-
260+
261261
buildMenuBar();
262262

263263
// For rev 0120, placing things inside a JPanel
@@ -305,7 +305,7 @@ public void windowDeactivated(WindowEvent e) {
305305
scrollPane.setViewportBorder(BorderFactory.createEmptyBorder());
306306
scrollPane.setLineNumbersEnabled(PreferencesData.getBoolean("editor.linenumbers"));
307307
scrollPane.setIconRowHeaderEnabled(false);
308-
308+
309309
Gutter gutter = scrollPane.getGutter();
310310
gutter.setBookmarkingEnabled(false);
311311
//gutter.setBookmarkIcon(CompletionsRenderer.getIcon(CompletionType.TEMPLATE));
@@ -714,8 +714,8 @@ private JMenu buildGitMenu() {
714714

715715
item = newJMenuItem(tr("Commit"), 'C');
716716
item.addActionListener(e -> {
717-
String commitMessage = JOptionPane.showInputDialog("Commit message:");
718-
gitManager.commit(sketch.getFolder(), commitMessage);
717+
String commitMessage = JOptionPane.showInputDialog("Commit message:");
718+
gitManager.commit(sketch.getFolder(), commitMessage);
719719
});
720720
gitMenu.add(item);
721721

@@ -725,6 +725,33 @@ private JMenu buildGitMenu() {
725725
);
726726
gitMenu.add(item);
727727

728+
item = newJMenuItem(tr("Diff"), 'D');
729+
item.addActionListener(e -> {
730+
gitManager.diff(sketch.getFolder());
731+
});
732+
gitMenu.add(item);
733+
734+
item = newJMenuItem(tr("Reset"), 'R');
735+
item.addActionListener(e -> {
736+
int i = JOptionPane.showConfirmDialog(
737+
null,
738+
tr("This is revert all changes.\n Are you sure?"),
739+
tr("alert"),
740+
JOptionPane.OK_CANCEL_OPTION
741+
);
742+
if (i == JOptionPane.OK_OPTION) {
743+
gitManager.reset(sketch.getFolder(), sketch.getCurrentCode().getFile());
744+
}
745+
// Update the currently visible program with its code
746+
try {
747+
sketch.load(true);
748+
textarea.setText(sketch.getCurrentCode().getProgram());
749+
} catch (IOException e1) {
750+
e1.printStackTrace();
751+
}
752+
});
753+
gitMenu.add(item);
754+
728755
return gitMenu;
729756
}
730757

@@ -1630,7 +1657,7 @@ public void actionPerformed(ActionEvent e) {
16301657
}
16311658

16321659
protected void updateUndoState() {
1633-
1660+
16341661
UndoManager undo = textarea.getUndoManager();
16351662

16361663
if (undo.canUndo()) {
@@ -1666,7 +1693,7 @@ public void actionPerformed(ActionEvent e) {
16661693

16671694
protected void updateRedoState() {
16681695
UndoManager undo = textarea.getUndoManager();
1669-
1696+
16701697
if (undo.canRedo()) {
16711698
redoItem.setEnabled(true);
16721699
redoItem.setText(undo.getRedoPresentationName());
@@ -1829,25 +1856,25 @@ protected void setCode(final SketchCodeDocument codeDoc) {
18291856
}
18301857
// set up this guy's own undo manager
18311858
// code.undo = new UndoManager();
1832-
1859+
18331860
codeDoc.setDocument(document);
18341861
}
18351862

18361863
if(codeDoc.getUndo() == null){
18371864
codeDoc.setUndo(new LastUndoableEditAwareUndoManager(textarea, this));
18381865
document.addUndoableEditListener(codeDoc.getUndo());
18391866
}
1840-
1867+
18411868
// Update the document object that's in use
18421869
textarea.switchDocument(document, codeDoc.getUndo());
1843-
1870+
18441871
// HACK multiple tabs: for update Listeners of Gutter, forcin call: Gutter.setTextArea(RTextArea)
18451872
// BUG: https://github.com/bobbylight/RSyntaxTextArea/issues/84
18461873
scrollPane.setViewportView(textarea);
1847-
1874+
18481875
textarea.select(codeDoc.getSelectionStart(), codeDoc.getSelectionStop());
18491876
textarea.requestFocus(); // get the caret blinking
1850-
1877+
18511878
final int position = codeDoc.getScrollPosition();
18521879

18531880
// invokeLater: Expect the document to be rendered correctly to set the new position
@@ -2594,7 +2621,7 @@ public void handleSerial() {
25942621
return;
25952622
}
25962623
}
2597-
2624+
25982625
if (serialMonitor != null) {
25992626
// The serial monitor already exists
26002627

@@ -2683,7 +2710,7 @@ public void handleSerial() {
26832710
} while (serialMonitor.requiresAuthorization() && !success);
26842711

26852712
}
2686-
2713+
26872714
public void handlePlotter() {
26882715
if(serialMonitor != null) {
26892716
if(serialMonitor.isClosed()) {
@@ -2693,7 +2720,7 @@ public void handlePlotter() {
26932720
return;
26942721
}
26952722
}
2696-
2723+
26972724
if (serialPlotter != null) {
26982725
// The serial plotter already exists
26992726

@@ -3014,7 +3041,7 @@ private void configurePopupMenu(final SketchTextArea textarea){
30143041
item.setName("menuToolsAutoFormat");
30153042

30163043
menu.add(item);
3017-
3044+
30183045
item = newJMenuItem(tr("Comment/Uncomment"), '/');
30193046
item.addActionListener(new ActionListener() {
30203047
public void actionPerformed(ActionEvent e) {
@@ -3058,23 +3085,23 @@ public void actionPerformed(ActionEvent e) {
30583085

30593086
final JMenuItem referenceItem = new JMenuItem(tr("Find in Reference"));
30603087
referenceItem.addActionListener(this::handleFindReference);
3061-
menu.add(referenceItem);
3088+
menu.add(referenceItem);
30623089

30633090
final JMenuItem openURLItem = new JMenuItem(tr("Open URL"));
30643091
openURLItem.addActionListener(new ActionListener() {
30653092
public void actionPerformed(ActionEvent e) {
30663093
Base.openURL(e.getActionCommand());
30673094
}
30683095
});
3069-
menu.add(openURLItem);
3070-
3096+
menu.add(openURLItem);
3097+
30713098
menu.addPopupMenuListener(new PopupMenuListener() {
30723099

30733100
@Override
30743101
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
30753102
String referenceFile = base.getPdeKeywords().getReference(getCurrentKeyword());
30763103
referenceItem.setEnabled(referenceFile != null);
3077-
3104+
30783105
int offset = textarea.getCaretPosition();
30793106
org.fife.ui.rsyntaxtextarea.Token token = RSyntaxUtilities.getTokenAtOffset(textarea, offset);
30803107
if (token != null && token.isHyperlink()) {
@@ -3107,4 +3134,6 @@ public void goToLine(int line) {
31073134
}
31083135
}
31093136

3137+
3138+
31103139
}

app/src/processing/app/git/GitManager.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,25 @@
33
import org.eclipse.jgit.api.Git;
44
import org.eclipse.jgit.api.errors.GitAPIException;
55
import org.eclipse.jgit.api.errors.NoHeadException;
6+
import org.eclipse.jgit.diff.DiffEntry;
7+
import org.eclipse.jgit.diff.DiffFormatter;
68
import org.eclipse.jgit.errors.RepositoryNotFoundException;
9+
import org.eclipse.jgit.lib.Constants;
10+
import org.eclipse.jgit.lib.ObjectReader;
711
import org.eclipse.jgit.lib.Repository;
812
import org.eclipse.jgit.revwalk.RevCommit;
13+
import org.eclipse.jgit.revwalk.RevTree;
14+
import org.eclipse.jgit.revwalk.RevWalk;
915
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
16+
import org.eclipse.jgit.treewalk.AbstractTreeIterator;
17+
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
18+
import org.eclipse.jgit.treewalk.FileTreeIterator;
1019

1120
import java.io.File;
1221
import java.io.IOException;
22+
import java.nio.file.Path;
23+
import java.nio.file.Paths;
24+
import java.util.List;
1325
import java.util.function.Consumer;
1426

1527

@@ -23,6 +35,62 @@ public void init(File repoDir) {
2335
}
2436
}
2537

38+
public void reset(File repoDir, File file) {
39+
Consumer<Git> resetCommand = git -> {
40+
try {
41+
// We need get relative repository path
42+
Path pathAbsolute = Paths.get(file.getPath());
43+
Path pathBase = Paths.get(repoDir.getPath());
44+
Path pathRelative = pathBase.relativize(pathAbsolute);
45+
46+
git.checkout().addPath(pathRelative.toString()).call();
47+
48+
System.out.println("Reset file " + file.getName());
49+
} catch (GitAPIException e) {
50+
e.printStackTrace();
51+
}
52+
};
53+
runGitCommand(repoDir, resetCommand);
54+
}
55+
56+
public void diff(File repoDir) {
57+
Consumer<Git> commitCommand = git -> {
58+
try {
59+
DiffFormatter diffFormatter = new DiffFormatter(System.out);
60+
diffFormatter.setRepository(git.getRepository());
61+
AbstractTreeIterator commitTreeIterator = prepareTreeParser(git.getRepository(), Constants.HEAD);
62+
FileTreeIterator workTreeIterator = new FileTreeIterator(git.getRepository());
63+
List<DiffEntry> diffEntries = diffFormatter.scan(commitTreeIterator, workTreeIterator);
64+
65+
for (DiffEntry entry : diffEntries) {
66+
System.out.printf("Entry: %s, from: %s, to: %s%n", entry, entry.getOldId(), entry.getNewId());
67+
diffFormatter.format(entry);
68+
}
69+
System.out.println("Diff in " + repoDir);
70+
} catch (IOException e) {
71+
e.printStackTrace();
72+
}
73+
};
74+
runGitCommand(repoDir, commitCommand);
75+
}
76+
77+
private AbstractTreeIterator prepareTreeParser(Repository repository, String objectId) throws IOException {
78+
// from the commit we can build the tree which allows us to construct the TreeParser
79+
try (RevWalk walk = new RevWalk(repository)) {
80+
RevCommit commit = walk.parseCommit(repository.resolve(objectId));
81+
RevTree tree = walk.parseTree(commit.getTree().getId());
82+
83+
CanonicalTreeParser oldTreeParser = new CanonicalTreeParser();
84+
try (ObjectReader oldReader = repository.newObjectReader()) {
85+
oldTreeParser.reset(oldReader, tree.getId());
86+
}
87+
88+
walk.dispose();
89+
90+
return oldTreeParser;
91+
}
92+
}
93+
2694
public void commit(File repoDir, String message) {
2795
if (!commitMessageIsValid(message)) {
2896
System.err.println("Commit message isn't valid.");

0 commit comments

Comments
 (0)