Я знаю, что этот вопрос был задан, я фактически использовал 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 ищет этот каталог, а не обязательно ваш репозиторий. Затем следуйте этому с командой.