Swift для запуска файла shell.command из директории macos osx - PullRequest
0 голосов
/ 04 февраля 2020

Я знаю, что этот вопрос был задан, я фактически использовал SO ответы, чтобы связать воедино мой процесс. Вот что я хочу сделать:

Пользователь выбирает папку / каталог из таблицы, приложение проверяет, является ли этот каталог включенным git, а затем проверяет, является ли каталог содержит скрипт оболочки, если нет, то копирует скрипт оболочки из комплекта, если так, то заменяет. (Чтобы обеспечить самый современный скрипт доступен). Песочница отключена, она будет работать только на нескольких локальных машинах, а не для коммерческого производства. Затем приложение должно запустить одну из функций скрипта, которые на данный момент являются просто командами basi c git, но могут стать более сложными. Это одна небольшая часть гораздо большего процесса автоматизации.

Я получаю эту ошибку:

[General] launch path not accessible
...
    13  AppKit                              0x00007fff2a03ebf3 -[NSTableView _sendSelectionChangedNotificationForRows:columns:] + 221
    14  AppKit                              0x00007fff2a291194 -[NSTableView mouseDown:] + 5883
    15  AppKit                              0x00007fff2a12dded -[NSWindow(NSEventRouting) _handleMouseDownEvent:isDelayedEvent:] + 4907
    16  AppKit                              0x00007fff2a097f3c -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] + 2612
    17  AppKit                              0x00007fff2a0972e5 -[NSWindow(NSEventRouting) sendEvent:] + 349
    18  AppKit                              0x00007fff2a09565c -[NSApplication(NSEvent) sendEvent:] + 352
    19  AppKit                              0x00007fff29ee13df -[NSApplication run] + 707
    20  AppKit                              0x00007fff29eb3775 NSApplicationMain + 777
    21  SDKFolderManager                    0x000000010000b61d main + 13
    22  libdyld.dylib                       0x00007fff643857fd start + 1

Вот что у меня есть:

gitmanager.command

#!/bin/bash
getStatus() {
  git status
}

addFiles() {
  git add .
  echo "The files were added to the current commit."
}

commitFiles() {
  git commit -m "Commiting files."
  echo "The changes were committed."
}

pushFiles() {
  git push
}

oneStepProcess() {
  git add .
  git commit -m "Commiting files to $1"
  git push
  echo "The files and their changes have been committed and pushed to the remote."
}

Когда пользователь выбирает строку таблицы (которая представляет собой список папок, которые они сохранили), приложение проверяет папку и добавляет / заменяет файл сценария. Затем он вызывает класс, содержащий функцию runShell:

//get status
if let launchPath = launch path {
   myAppManager.runShell(launchPath.absoluteString, ". ./gitmanager.command | getStatus", completion: {(strResults:String) in
      print(strResults)
   })
}

launchPath - это путь к файлу сценария, например:

file:///Users/xxxxxxxxx/Desktop/xxxx/Repos/test/sdk1/

Это Функция запуска оболочки в AppManager:

typealias runShellClosure = (_ jsonString:String) -> Void
...
func runShell(_ launchPath:String, _ command: String, completion: runShellClosure) {

   //set up the task, we are going to pass the path to the git repo
   //the command is the function we want to run in the script
   let task = Process()
   task.launchPath = launchPath//"/bin/bash"
   task.arguments = ["-c", command]

   let pipe = Pipe()
   task.standardOutput = pipe
   task.launch()

   let data = pipe.fileHandleForReading.readDataToEndOfFile()
   let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String

   completion(output)
}

Если я передаю / bin / bash функции runShell, она работает, как и ожидалось:

myAppManager.runShell("/bin/bash", "echo Hello World!", completion: {(strResults:String) in
                            print(strResults)
                        })

Так что может показаться, что это путь запуска, который я отправляю, вызывает ошибку. Я могу сделать это в терминале с ожидаемыми результатами (без изменения тега, заканчивающегося на. sh из .command):

cd PATH/TO/SHELL/SCRIPT
.  ./gitmanager.sh
getStatus

Результаты:

On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    gitmanager.sh

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    gitmanager.command

no changes added to commit (use "git add" and/or "git commit -a")

Так что я думаю, мне интересно если я делаю что-то не так или это просто невозможно? Если последнее, какие-либо предложения для обхода? Должен добавить, что у меня есть опыт работы со Swift, но меньше - со сценариями оболочки.

Редактировать:

Как обычно, я использую молоток для приготовления блинов. Шпатель найден. Я не знал о команде git -dir, которая позволяет вам делать git вызовы в пути к каталогам. Я все еще надеюсь, что кто-то может ответить на этот вопрос, но если вам нужна эта работа, я включил ее ниже:

Новый вызов будет:

var strTerminalPath = myAppManager.makePath(launchPath)
myAppManager.runShell("/bin/bash", "git --git-dir \(strTerminalPath).git status", completion: {(strResults:String) in
     print(strResults)
})

Var strTerminalPath предназначен для конвертируйте что-то вроде file:///Users/PATH/To/REPO в ~/Desktop/PATH/TO/REPO, которое указано c для моего использования, но вам нужно сбросить файл: /// и затем указать свой репозиторий. Также обратите внимание, что вам нужно добавить каталог /.git в конец этого пути. Git ищет этот каталог, а не обязательно ваш репозиторий. Затем следуйте этому с командой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...