From 84dbbe7bcb37f8d0b150c555c87eeb036968e72b Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Wed, 15 Nov 2023 10:23:20 +0530 Subject: [PATCH] fix(terminal): bootstrap packages are not installed on first install --- .../androidide/activities/TerminalActivity.kt | 2 +- .../main/java/com/termux/app/TermuxInstaller.java | 6 ++++-- .../environment/AndroidShellEnvironment.java | 6 +++++- .../shared/termux/shell/TermuxShellUtils.java | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt index 89fbfaeeb..48468a34f 100755 --- a/app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt @@ -52,8 +52,8 @@ class TerminalActivity : TermuxActivity() { } override fun onServiceConnected(componentName: ComponentName?, service: IBinder?) { - writeSourcesList() super.onServiceConnected(componentName, service) + writeSourcesList() } private fun writeSourcesList() { diff --git a/termux/termux-app/src/main/java/com/termux/app/TermuxInstaller.java b/termux/termux-app/src/main/java/com/termux/app/TermuxInstaller.java index 63a6d8ee3..102d71eaf 100644 --- a/termux/termux-app/src/main/java/com/termux/app/TermuxInstaller.java +++ b/termux/termux-app/src/main/java/com/termux/app/TermuxInstaller.java @@ -33,10 +33,13 @@ import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import static com.itsaky.androidide.utils.Environment.PREFIX; +import static com.itsaky.androidide.utils.Environment.SHELL; import static com.termux.shared.termux.TermuxConstants.TERMUX_PREFIX_DIR; import static com.termux.shared.termux.TermuxConstants.TERMUX_PREFIX_DIR_PATH; import static com.termux.shared.termux.TermuxConstants.TERMUX_STAGING_PREFIX_DIR; import static com.termux.shared.termux.TermuxConstants.TERMUX_STAGING_PREFIX_DIR_PATH; +import static com.termux.shared.termux.shell.TermuxShellUtils.shellExists; /** * Install the Termux bootstrap packages if necessary by following the below steps: @@ -102,8 +105,7 @@ public final class TermuxInstaller { return; } - // If prefix directory exists, even if its a symlink to a valid directory and symlink is not broken/dangling - if (FileUtils.directoryFileExists(TERMUX_PREFIX_DIR_PATH, true)) { + if (shellExists(false)) { if (TermuxFileUtils.isTermuxPrefixDirectoryEmpty()) { Logger.logInfo(LOG_TAG, "The termux prefix directory \"" + TERMUX_PREFIX_DIR_PATH + "\" exists but is empty or only contains specific unimportant files."); } else { diff --git a/termux/termux-shared/src/main/java/com/termux/shared/shell/command/environment/AndroidShellEnvironment.java b/termux/termux-shared/src/main/java/com/termux/shared/shell/command/environment/AndroidShellEnvironment.java index 8d113d015..02b8d35b6 100644 --- a/termux/termux-shared/src/main/java/com/termux/shared/shell/command/environment/AndroidShellEnvironment.java +++ b/termux/termux-shared/src/main/java/com/termux/shared/shell/command/environment/AndroidShellEnvironment.java @@ -31,7 +31,11 @@ public class AndroidShellEnvironment extends UnixShellEnvironment { @NonNull @Override public HashMap getEnvironment(@NonNull Context currentPackageContext, boolean isFailSafe) { - HashMap environment = new HashMap<>(Environment.getEnvironment()); + HashMap environment = new HashMap<>(); + + if (!isFailSafe) { + environment.putAll(Environment.getEnvironment()); + } environment.put(ENV_HOME, "/"); environment.put(ENV_LANG, "en_US.UTF-8"); diff --git a/termux/termux-shared/src/main/java/com/termux/shared/termux/shell/TermuxShellUtils.java b/termux/termux-shared/src/main/java/com/termux/shared/termux/shell/TermuxShellUtils.java index de56a29e3..461f0e91b 100644 --- a/termux/termux-shared/src/main/java/com/termux/shared/termux/shell/TermuxShellUtils.java +++ b/termux/termux-shared/src/main/java/com/termux/shared/termux/shell/TermuxShellUtils.java @@ -3,13 +3,16 @@ package com.termux.shared.termux.shell; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.itsaky.androidide.utils.Environment; import com.termux.shared.errors.Error; import com.termux.shared.file.filesystem.FileTypes; +import com.termux.shared.shell.command.environment.UnixShellEnvironment; import com.termux.shared.termux.TermuxConstants; import com.termux.shared.file.FileUtils; import com.termux.shared.logger.Logger; import com.termux.shared.termux.settings.properties.TermuxAppSharedProperties; +import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment; import org.apache.commons.io.filefilter.TrueFileFilter; import java.io.File; @@ -23,6 +26,17 @@ public class TermuxShellUtils { private static final String LOG_TAG = "TermuxShellUtils"; + public static boolean shellExists(boolean failsafe) { + for (String shellBinary : UnixShellEnvironment.LOGIN_SHELL_BINARIES) { + File shellFile = new File(Environment.PREFIX, shellBinary); + if (shellFile.canExecute()) { + return true; + } + } + + return false; + } + /** * Setup shell command arguments for the execute. The file interpreter may be prefixed to * command arguments if needed.