Tombol Run menghormati Terminal=true (gio launch) + wrapper pakai script asli
- launch lewat 'gio launch <file .desktop>' kalau tersedia: Terminal=true membuka terminal, Path= dihormati, sama seperti menu desktop (script yang butuh sudo atau input sekarang bisa jalan dari tombol Run) - wrapper script memakai berkas script asli kalau masih ada, jadi dirname $0 menunjuk folder aslinya (laporan/hasil tidak nyasar ke ~/.local/bin); salinan .real tetap jadi cadangan - tes: pemilihan perintah launch, wrapper memakai script asli + PATH
This commit is contained in:
1 parent
581cd07dba
commit
35e83dba09
7 files changed
+150
-18
No files matched your search
@@ -121,6 +121,8 @@ case "$PATH" in *".local/bin"*) echo "path ok";; *) echo "path hilang";; esac
|
||||
if !strings.Contains(string(out), "path ok") {
|
||||
t.Errorf("PATH tidak disiapkan wrapper: %s", out)
|
||||
}
|
||||
// script asli di folder asalnya masih ada di mesin ini? bukan di sini,
|
||||
// jadi wrapper memakai salinannya (sudah diuji lewat 'data ok' di atas)
|
||||
|
||||
// binary biasa hasil restore juga harus executable
|
||||
tool := restored["Tool"]
|
||||
|
||||
@@ -117,7 +117,7 @@ func installBinary(kind, src, binDst string) error {
|
||||
if err := copyFile(src, binDst+scriptSuffix, 0o755); err != nil {
|
||||
return err
|
||||
}
|
||||
return writeScriptWrapper(binDst, binDst+scriptSuffix, filepath.Dir(src))
|
||||
return writeScriptWrapper(binDst, binDst+scriptSuffix, src)
|
||||
}
|
||||
if samePath(src, binDst) {
|
||||
return nil
|
||||
@@ -137,16 +137,26 @@ func writeFileMode(path string, data []byte, mode os.FileMode) error {
|
||||
const scriptSuffix = ".real"
|
||||
|
||||
// writeScriptWrapper menulis wrapper yang menyiapkan PATH dan folder kerja
|
||||
// sebelum menjalankan script aslinya.
|
||||
func writeScriptWrapper(path, real, originDir string) error {
|
||||
// sebelum menjalankan script.
|
||||
//
|
||||
// Script asli di folder asalnya dipakai lebih dulu kalau masih ada (supaya
|
||||
// `dirname $0` dan berkas di sebelahnya tetap mengarah ke sana); salinan di
|
||||
// ~/.local/bin jadi cadangan kalau script aslinya sudah pindah/dihapus.
|
||||
func writeScriptWrapper(path, real, originFile string) error {
|
||||
body := "#!/bin/sh\n" +
|
||||
"# dibuat oleh LazyRun: siapkan PATH & folder kerja lalu jalankan script aslinya\n" +
|
||||
"# dibuat oleh LazyRun: siapkan PATH & folder kerja lalu jalankan script\n" +
|
||||
`PATH="$HOME/.local/bin:$PATH"` + "\n" +
|
||||
"export PATH\n"
|
||||
if originDir != "" && originDir != "." {
|
||||
|
||||
originDir := filepath.Dir(originFile)
|
||||
if originDir != "" && originDir != "." && originDir != "/" {
|
||||
quoted := shellQuote(originDir)
|
||||
body += "if [ -d " + quoted + " ]; then cd " + quoted + " || exit 1; fi\n"
|
||||
}
|
||||
|
||||
if originFile != "" && originFile != real {
|
||||
body += "if [ -f " + shellQuote(originFile) + " ]; then exec " + shellQuote(originFile) + ` "$@"; fi` + "\n"
|
||||
}
|
||||
body += "exec " + shellQuote(real) + ` "$@"` + "\n"
|
||||
return os.WriteFile(path, []byte(body), 0o755)
|
||||
}
|
||||
|
||||
@@ -267,3 +267,35 @@ func TestUninstallKeepsBinaryByDefault(t *testing.T) {
|
||||
t.Errorf("binary harus tetap ada: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestScriptWrapperPrefersOriginalFile(t *testing.T) {
|
||||
home := testEnv(t)
|
||||
dir := filepath.Join(home, "proyek")
|
||||
if err := os.MkdirAll(dir, 0o755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
src := filepath.Join(dir, "bench.sh")
|
||||
if err := os.WriteFile(src, []byte("#!/bin/sh\necho asli \"$(pwd)\"\n"), 0o755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
sc, err := InstallExecutable(ExecOptions{BinaryPath: src, Name: "Bench", Menu: true})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
wrapper, err := os.ReadFile(sc.BinaryPath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
text := string(wrapper)
|
||||
if !strings.Contains(text, shellQuote(src)) {
|
||||
t.Errorf("wrapper tidak memakai script asli:\n%s", text)
|
||||
}
|
||||
if !strings.Contains(text, shellQuote(dir)) {
|
||||
t.Errorf("wrapper tidak cd ke folder asli:\n%s", text)
|
||||
}
|
||||
if !strings.Contains(text, "PATH=\"$HOME/.local/bin:$PATH\"") {
|
||||
t.Errorf("wrapper tidak menyiapkan PATH:\n%s", text)
|
||||
}
|
||||
}
|
||||
@@ -108,7 +108,11 @@ func restoreBinary(restored *store.Shortcut, slug string, binary []byte) error {
|
||||
if err := os.Rename(binDst, binDst+scriptSuffix); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := writeScriptWrapper(binDst, binDst+scriptSuffix, originDir); err != nil {
|
||||
originFile := ""
|
||||
if originDir != "" {
|
||||
originFile = filepath.Join(originDir, filepath.Base(restored.BinaryPath))
|
||||
}
|
||||
if err := writeScriptWrapper(binDst, binDst+scriptSuffix, originFile); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user