Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: ImpactDevelopment/Installer
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0.8.5
Choose a base ref
...
head repository: ImpactDevelopment/Installer
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: master
Choose a head ref

Commits on Apr 24, 2020

  1. Copy the full SHA
    29bf252 View commit details
  2. Copy the full SHA
    1b17a79 View commit details
  3. Release 0.8.6

    leijurv committed Apr 24, 2020
    Copy the full SHA
    5df8d83 View commit details
  4. Copy the full SHA
    0e4e60b View commit details

Commits on Apr 26, 2020

  1. Copy the full SHA
    ce2e0c6 View commit details

Commits on Apr 27, 2020

  1. Remove MC Directory setting from GUI

    Since the official launcher's location isn't officially configurable, this setting is only for rare cases.
    Therefore having it as a CLI-only setting is less confusing and simplifies the GUI.
    LeafHacker committed Apr 27, 2020
    Copy the full SHA
    f26710d View commit details
  2. Fix NPE when XDG_DOWNLOAD_DIR is not set

    Apparently System.getenv() is nullable
    LeafHacker committed Apr 27, 2020
    Copy the full SHA
    2202556 View commit details

Commits on Apr 28, 2020

  1. MavenResolver parse coordinates properly

    Added a small Artifact class that takes maven coords and provides methods to get the various parts. This makes it easier for MavenResolver to extract those.
    
    Followed the gradle-style maven coordinates which are slightly different from the aether coordinates used internally by maven.
    
    This is a precursor to some upcoming MultiMC memes...
    LeafHacker committed Apr 28, 2020
    Copy the full SHA
    03864b3 View commit details

Commits on May 3, 2020

  1. Copy the full SHA
    9869a9a View commit details

Commits on May 8, 2020

  1. Copy the full SHA
    77e9623 View commit details
  2. Release 0.9.0

    LeafHacker committed May 8, 2020
    Copy the full SHA
    5345d0d View commit details

Commits on May 30, 2020

  1. Copy the full SHA
    e90bcf3 View commit details

Commits on Jun 7, 2020

  1. Copy the full SHA
    c589e6c View commit details
  2. Copy the full SHA
    d0619b6 View commit details
  3. Copy the full SHA
    8ee8c4d View commit details
  4. Release 0.9.1

    LeafHacker committed Jun 7, 2020
    Copy the full SHA
    198ceb1 View commit details

Commits on Aug 9, 2020

  1. Fix null settings error

    This reverts some changes from a953c7d until we can find a better way to install unreleased mc versions.
    LeafHacker committed Aug 9, 2020
    Copy the full SHA
    d0a7b4c View commit details
  2. Release 0.9.2

    LeafHacker committed Aug 9, 2020
    Copy the full SHA
    75d8515 View commit details

Commits on Aug 16, 2020

  1. Copy the full SHA
    1020bbf View commit details
  2. Warn when running as root

    Closes #106
    LeafHacker committed Aug 16, 2020
    Copy the full SHA
    60d0ce2 View commit details
  3. Rename modes for clarity

    LeafHacker committed Aug 16, 2020
    Copy the full SHA
    267f391 View commit details
  4. Show Launcher Directory setting in GUI

    But only in Official Launcher mode
    LeafHacker committed Aug 16, 2020
    Copy the full SHA
    66a2a16 View commit details
  5. Fix changelog header

    LeafHacker committed Aug 16, 2020
    Copy the full SHA
    4bfa96b View commit details
  6. Show version in window title

    Closes #62
    LeafHacker committed Aug 16, 2020
    Copy the full SHA
    a844134 View commit details
  7. Copy the full SHA
    9f49b60 View commit details

Commits on Aug 28, 2020

  1. Release 0.9.3

    LeafHacker committed Aug 28, 2020
    Copy the full SHA
    84a042d View commit details

Commits on Jan 2, 2021

  1. Fix NPE while checking whether to disable button

    shouldInstallButtonBeEnabled() switches on OptiFineSetting's value if OptiFineToggleSetting is enabled. However OptiFineSetting's value is null when OptiFine isn't supported by the current installation mode.
    
    Fixes #117
    LeafHacker committed Jan 2, 2021
    Copy the full SHA
    798a13f View commit details
  2. Update CHANGELOG to say #116 is fixed

    No actual changes required, since this was caused by an error building releases not an error in source code.
    
    Fixes #116
    LeafHacker committed Jan 2, 2021
    Copy the full SHA
    91e8a76 View commit details
  3. Open Save As dialog using the default destination

    We want to open `JFileChooser` at `DestinationSetting`'s _default_ value, not whatever the user most recently configured
    This might be unintuitive in edge-cases such as the user setting `--destination` on the CLI when launching the GUI,
    however `--destination` should still be respected when not running the GUI.
    
    Fixes #115
    LeafHacker committed Jan 2, 2021
    Copy the full SHA
    a3b51f0 View commit details
  4. Release 0.9.4

    LeafHacker committed Jan 2, 2021
    Copy the full SHA
    0622f0c View commit details
  5. Copy the full SHA
    2405895 View commit details

Commits on Jun 20, 2021

  1. Release 0.9.5

    leijurv committed Jun 20, 2021
    Copy the full SHA
    acda0df View commit details
Showing with 1,702 additions and 220 deletions.
  1. +68 −1 CHANGELOG.md
  2. +8 −7 CONTRIBUTING.md
  3. +2 −2 README.md
  4. +1 −1 build.gradle
  5. +35 −11 src/main/java/io/github/ImpactDevelopment/installer/Args.java
  6. +21 −1 src/main/java/io/github/ImpactDevelopment/installer/Installer.java
  7. +1 −1 src/main/java/io/github/ImpactDevelopment/installer/gui/AppWindow.java
  8. +255 −0 src/main/java/io/github/ImpactDevelopment/installer/gui/JHyperlink.java
  9. +205 −40 src/main/java/io/github/ImpactDevelopment/installer/gui/pages/MainPage.java
  10. +2 −0 src/main/java/io/github/ImpactDevelopment/installer/impact/ImpactJsonVersion.java
  11. +78 −5 src/main/java/io/github/ImpactDevelopment/installer/libraries/MavenResolver.java
  12. +199 −0 src/main/java/io/github/ImpactDevelopment/installer/optifine/OptiFine.java
  13. +58 −0 src/main/java/io/github/ImpactDevelopment/installer/optifine/OptiFineExisting.java
  14. +40 −0 src/main/java/io/github/ImpactDevelopment/installer/setting/BooleanSetting.java
  15. +7 −4 src/main/java/io/github/ImpactDevelopment/installer/setting/InstallationConfig.java
  16. +58 −0 src/main/java/io/github/ImpactDevelopment/installer/setting/settings/DestinationSetting.java
  17. +3 −4 src/main/java/io/github/ImpactDevelopment/installer/setting/settings/MinecraftDirectorySetting.java
  18. +0 −5 src/main/java/io/github/ImpactDevelopment/installer/setting/settings/MinecraftVersionSetting.java
  19. +98 −0 src/main/java/io/github/ImpactDevelopment/installer/setting/settings/MultiMCDirectorySetting.java
  20. +55 −0 src/main/java/io/github/ImpactDevelopment/installer/setting/settings/OptiFineFileSetting.java
  21. +11 −3 src/main/java/io/github/ImpactDevelopment/installer/setting/settings/OptiFineSetting.java
  22. +39 −0 src/main/java/io/github/ImpactDevelopment/installer/setting/settings/OptiFineToggleSetting.java
  23. +5 −1 src/main/java/io/github/ImpactDevelopment/installer/target/InstallationMode.java
  24. +17 −22 src/main/java/io/github/ImpactDevelopment/installer/target/InstallationModeOptions.java
  25. +77 −20 src/main/java/io/github/ImpactDevelopment/installer/target/targets/Forge.java
  26. +239 −23 src/main/java/io/github/ImpactDevelopment/installer/target/targets/MultiMC.java
  27. +6 −1 src/main/java/io/github/ImpactDevelopment/installer/target/targets/ShowJSON.java
  28. +85 −68 src/main/java/io/github/ImpactDevelopment/installer/target/targets/Vanilla.java
  29. +29 −0 src/main/java/io/github/ImpactDevelopment/installer/utils/OperatingSystem.java
69 changes: 68 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -6,6 +6,65 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.9.5] - 2021-06-20

### Fixes
- Fix an error when attempting to install OptiFine with 1.16+

## [0.9.4] - 2021-01-02

### Fixes
- Fix error checking whether to enable the Install button when OptiFine is enabled but not supported ([#117](https://github.com/ImpactDevelopment/Installer/issues/117))
- Fix the 0.9.2 & 0,9,3 releases to showing nightly builds by default ([#116](https://github.com/ImpactDevelopment/Installer/issues/116))
- Fix the default destination value not being used on freshly opened Save As dialogs ([#115](https://github.com/ImpactDevelopment/Installer/issues/115))

## [0.9.3] - 2020-08-28

### Added
- A warning when the installer is run as root on non-Windows systems ([#106](https://github.com/ImpactDevelopment/Installer/issues/106))
- Add back the "Minecraft Directory" setting to the GUI (was removed in 0.9.0). Now renamed to "Launcher Directory" and only shown when installing in "Official Launcher" mode

### Changed
- Renamed "Vanilla" mode to "Official Launcher" and "Forge" mode to "Forge Mod"
- The installer version is now shown in the window title ([#62](https://github.com/ImpactDevelopment/Installer/issues/62))

### Fixes
- Fix using an already installed OptiFine version not working correctly for MultiMC instances ([#107](https://github.com/ImpactDevelopment/Installer/issues/107))

## [0.9.2] - 2020-08-09

### Fixes
- Fix error building setting for null value when changing settings in certain orders. This fix reverts a change in [0.5.6] intended to allow installing unreleased Minecraft versions using a custom JSON file.

## [0.9.1] - 2020-06-07

### Changed
- Already installed OptiFine versions installed in the Official Launcher can be used again, without requiring an OptiFine installer jar.
- Improved the GUI spacing and layout.
- Improved the OptiFine download link using `JHyperlink` from the [SwingSet3 demo](https://mvnrepository.com/artifact/org.webswing/webswing-demo-swingset3).

### Fixed
- Persisting the Google Analytics client ID when installing for MultiMC

## [0.9.0] - 2020-05-08

### Added
- Added full support for MultiMC installation. The MultiMC mode now creates an instance just like the Vanilla mode creates a profile.
- Added a "Save As" dialog to the Forge installation mode and a matching CLI argument `--destination`. This replaces the previous "Install" button, but only for Forge mode.

### Changed
- Reworked the way OptiFine is supported. Instead of searching for an installed OptiFine instance, the user provides us with an OptiFine installer jar.
- `--minecraft-directory`'s aliases changed; `--launcher-dir` and `--launcher-directory` were added and `--mc-path` was removed.
- In "Show Vanilla JSON" mode the "Install" button now says "Show JSON" instead.

## Removed
- Minecraft Directory setting from the GUI. It is still present as a CLI option.

## [0.8.6] - 2020-04-24

### Added
- Added a sketchy compatibility mode for Forge + Liteloader for 1.12.2 only

## [0.8.5] - 2020-03-25

### Added
@@ -176,7 +235,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- GPG signature checking of Impact and Baritone release artifacts
- Initial documentation including a README and this CHANGELOG

[Unreleased]: https://github.com/ImpactDevelopment/Installer/compare/0.8.5...HEAD
[Unreleased]: https://github.com/ImpactDevelopment/Installer/compare/0.9.5...HEAD
[0.9.5]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.9.5
[0.9.4]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.9.4
[0.9.3]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.9.3
[0.9.2]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.9.2
[0.9.1]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.9.1
[0.9.0]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.9.0
[0.8.6]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.8.6
[0.8.5]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.8.5
[0.8.4]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.8.4
[0.8.3]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.8.3
@@ -190,6 +256,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[0.7.1]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.7.1
[0.7.0]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.7.0
[0.6.0]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.6.0
[0.5.6]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.5.6
[0.5.5]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.5.5
[0.5.4]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.5.4
[0.5.3]: https://github.com/ImpactDevelopment/Installer/releases/tag/0.5.3
15 changes: 8 additions & 7 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Contributing to the Installer

## I have a question
Issues aren't intended for handling questions. You're much better off contacting us through one of these methods [Discord]()
Issues aren't intended for handling questions. You're much better off contacting us through one of these methods [Discord][discord]

## I found a bug
Before reporting a bug, please take the time to check if someone else has already. Search the [issues list] for keywords that might match your issue.
@@ -20,7 +20,7 @@ Please do your best to follow the guidance below regarding [documenting your cha

Once that's done you can checkout a new branch, make your changes to it, publish it and open a Pull Request asking us to merge the changes in your branch.

Please see [Creating a Pull Request from a Fork](https://help.github.com/en/articles/creating-a-pull-request-from-a-fork). If you're brand new to git checkout [Try Git](http://try.github.io/) or one of these [awesome tutorials](https://gist.github.com/jaseemabid/1321592)
Please see [Creating a Pull Request from a Fork](https://help.github.com/en/articles/creating-a-pull-request-from-a-fork). If you're brand new to git checkout [Try Git](https://try.github.io/) or one of these [awesome tutorials](https://gist.github.com/jaseemabid/1321592)

### Documenting your changes

@@ -45,11 +45,12 @@ You'll want to add your change in the `## [Upcoming]` section, since it will mos

Finally, remember that Changelogs are for humans, not machines. You should be describing what changed, from a user's perspective, not how it was changed from a technical perspective (that is what commit messages are for).

[issues list]: /ImpactDevelopment/Installer/issues
[new issue]: /ImpactDevelopment/Installer/issues/new
[fork]: /ImpactDevelopment/Installer/fork
[devenv]: /ImpactDevelopment/Installer#setting-up-a-development-environment
[issues list]: https://github.com/ImpactDevelopment/Installer/issues
[new issue]: https://github.com/ImpactDevelopment/Installer/issues/new
[fork]: https://github.com/ImpactDevelopment/Installer/fork
[devenv]: README.md#setting-up-a-development-environment
[contrib]: CONTRIBUTORS.md
[documenting your changes]: #documenting-your-changes
[Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
[good commit message]: https://chris.beams.io/posts/git-commit/
[good commit message]: https://chris.beams.io/posts/git-commit/
[discord]: https://impactclient.net/discord
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -29,5 +29,5 @@ You can now run or debug the installer with `Shift`+`F10` and `Shift`+`F9`.
Please see [Contributing]

[Impact]: https://impactdevelopment.github.io/
[releases]: /ImpactDevelopment/Installer/releases
[Contributing]: /ImpactDevelopment/Installer/blob/master/CONTRIBUTING.md
[releases]: https://github.com/ImpactDevelopment/Installer/releases
[Contributing]: CONTRIBUTING.md
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -38,7 +38,7 @@ plugins {
ext {
id = 'ImpactInstaller'
group 'io.github.ImpactDevelopment'
version '0.8.5'
version '0.9.5'
description = 'Impact Installer'
mainClassName = 'io.github.ImpactDevelopment.installer.Installer'
targetCompatibility = sourceCompatibility = JavaVersion.VERSION_1_8
46 changes: 35 additions & 11 deletions src/main/java/io/github/ImpactDevelopment/installer/Args.java
Original file line number Diff line number Diff line change
@@ -28,6 +28,7 @@
import io.github.ImpactDevelopment.installer.impact.ImpactVersionReleased;
import io.github.ImpactDevelopment.installer.impact.ImpactVersions;
import io.github.ImpactDevelopment.installer.setting.InstallationConfig;
import io.github.ImpactDevelopment.installer.setting.Setting;
import io.github.ImpactDevelopment.installer.setting.settings.*;
import io.github.ImpactDevelopment.installer.target.InstallationModeOptions;

@@ -63,10 +64,16 @@ public class Args {
@Parameter(names = {"--all"}, description = "Run on all Impact releases")
public boolean all = false;

@Parameter(names = {"--mc-dir", "--minecraft-dir", "--minecraft-directory", "--mc-path"}, description = "Path to the Minecraft directory")
@Parameter(names = {"--out", "--destination", "--dest"}, description = "Where to output \"Save As\" style modes like \"Forge\".")
public String dest;

@Parameter(names = {"--mc-dir", "--minecraft-dir", "--minecraft-directory", "--launcher-dir", "--launcher-directory"}, description = "Path to the Minecraft Launcher directory")
public String mcPath;

@Parameter(names = {"--optifine", "--of"}, description = "OptiFine, in the format like 1.12.2_HD_U_E2")
@Parameter(names = {"--mmc-dir", "--multimc-dir", "--multimc-directory", "--mmc-path"}, description = "Path to the MultiMC directory")
public String multimcPath;

@Parameter(names = {"--optifine", "--of"}, description = "Path to an OptiFine installer jar or the version of an already installed OptiFine")
public String optifine;

@Parameter(names = {"--no-ga", "--no-analytics", "--dnt", "--no-tracky"}, description = "Disable Google Analytics")
@@ -112,13 +119,6 @@ public Args() {
}

public void apply(InstallationConfig config) {
if (mcPath != null) {
Path path = Paths.get(mcPath);
if (!Files.isDirectory(path)) {
throw new IllegalStateException(path + " is not a directory");
}
config.setSettingValue(MinecraftDirectorySetting.INSTANCE, path);
}
if (mode != null) {
config.setSettingValue(InstallationModeSetting.INSTANCE, InstallationModeOptions.valueOf(mode.toUpperCase()));
}
@@ -127,7 +127,7 @@ public void apply(InstallationConfig config) {
setImpactVersion(config, true, version);
try {
System.out.println(config.execute());
} catch (IOException e) {
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
@@ -144,10 +144,34 @@ public void apply(InstallationConfig config) {
setImpactVersion(config, false, new ImpactVersionDisk(Paths.get(file)));
}
if (optifine != null) {
if (!config.setSettingValue(OptiFineSetting.INSTANCE, optifine)) {
config.setSettingValue(OptiFineToggleSetting.INSTANCE, true);

// Use OptiFineSetting before falling back to OptiFineFileSetting
if (config.setSettingValue(OptiFineSetting.INSTANCE, optifine)) {
System.out.println("Using existing installed OptiFine version " + optifine);
} else if (config.setSettingValue(OptiFineFileSetting.INSTANCE, Paths.get(optifine))) {
System.out.println("Using OptiFine installer " + Paths.get(optifine).getFileName());
} else {
throw new IllegalArgumentException(optifine + " is not found");
}
}
if (mcPath != null) {
setPath(config, MinecraftDirectorySetting.INSTANCE, mcPath, true);
}
if (multimcPath != null) {
setPath(config, MultiMCDirectorySetting.INSTANCE, multimcPath, true);
}
if (dest != null) {
setPath(config, DestinationSetting.INSTANCE, dest, false);
}
}

private void setPath(InstallationConfig config, Setting<Path> setting, String value, boolean mustBeDirectory) {
Path path = Paths.get(value);
if (mustBeDirectory && !Files.isDirectory(path)) {
throw new IllegalStateException(path + " is not a directory");
}
config.setSettingValue(setting, path);
}

private void setImpactVersion(InstallationConfig config, boolean checkMcVersionValidityAgainstReleases, ImpactVersion version) {
Original file line number Diff line number Diff line change
@@ -23,11 +23,13 @@
package io.github.ImpactDevelopment.installer;

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Strings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import io.github.ImpactDevelopment.installer.gui.AppIcon;
import io.github.ImpactDevelopment.installer.gui.AppWindow;
import io.github.ImpactDevelopment.installer.setting.InstallationConfig;
import io.github.ImpactDevelopment.installer.utils.OperatingSystem;
import io.github.ImpactDevelopment.installer.utils.Tracky;

import javax.swing.*;
@@ -44,7 +46,15 @@ public class Installer {
public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
public static final Args args = new Args();

private static final boolean root = OperatingSystem.getOS() != WINDOWS && System.getProperty("user.name").equalsIgnoreCase("root");
private static final String rootWarning = "It is not recommended to run this installer as the root user. Doing so can lead to unexpected behaviour and broken file permissions.";

public static void main(String... argv) throws Throwable {
// Warn if root, see also setupGUI for the GUI warning
if (root) {
System.err.println("Warning: " + rootWarning);
}

// Parse CLI arguments
JCommander cmd = JCommander.newBuilder()
.programName(getCommand())
@@ -94,6 +104,12 @@ private static void setupGUI(InstallationConfig config) throws Throwable {
System.setProperty("apple.awt.fileDialogForDirectories", "true");
}

// Warn if root, see also main for the CLI version
// showMessageDialog is blocking, so AppWindow won't show until the user clicks OK
if (root) {
JOptionPane.showMessageDialog(null, rootWarning, "Warning", JOptionPane.WARNING_MESSAGE);
}

SwingUtilities.invokeLater(() -> new AppWindow(config));
}

@@ -123,7 +139,11 @@ private static String getFilename() {
}

public static String getVersion() {
return args.getClass().getPackage().getImplementationVersion();
String version = args.getClass().getPackage().getImplementationVersion();
if (Strings.isStringEmpty(version)) {
return "dev build";
}
return version;
}

public static String getTitle() {
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ public class AppWindow extends JFrame {

public AppWindow(InstallationConfig config) {
this.config = config;
setTitle(Installer.getTitle());
setTitle(Installer.getTitle() + " - " + Installer.getVersion());
setDefaultCloseOperation(EXIT_ON_CLOSE);
if (getOS() == OSX) { // window.setTitle() isn't good enough on OSX
System.setProperty("com.apple.mrj.application.apple.menu.about.name", getTitle());
Loading