在 TeXStudio 脚本内按顺序运行命令

在 TeXStudio 脚本内按顺序运行命令

我正在尝试设置一个宏来设置 git repo 进行版本控制,这样我就不必每次都求助于手动终端命令。提交并推送脚本已经准备就绪并开始工作,但它正在初始化一个新的 git repo,这让我很伤心:

这个想法是,脚本将执行 4 个功能:

  1. 在文件保存的同一目录中初始化 git repo
  2. 克隆一个远程仓库(我有一个基础仓库,里面有我想放到我创建的所有 tex 项目中的脚本/包)
  3. 创建新的远程仓库(使用节点 GH)并将其指定为原点(基本上重新创建通过命令行从自己那里分叉 repo 的能力)
  4. 提交并将所有文件推送到新的远程存储库。

这是我的代码:

%SCRIPT
buildManager.runCommand("git init", editor.fileName());
buildManager.runCommand("gh re --new " + editor.fileName() + 
  " --type private", editor.fileName());
buildManager.runCommand("git clone https://github.com/example/example.git " 
  + editor.fileName(), editor.fileName());
buildManager.runCommand("git remote set-url origin https://github.com/example/" 
  + editor.fileName(), editor.fileName());
buildManager.runCommand("git push origin master", editor.fileName());
buildManager.runCommand("git push --all", editor.fileName())

问题是我认为 TeXStudio 没有按出现的顺序执行命令,这导致某些命令失败(底部的示例输出)。有没有办法定义命令执行的顺序?或者,我可以通过调用 bash 脚本(我可以在其中定义顺序)并通过宏传递工作目录来执行相同操作吗?


日志输出:

Process started: git push --all
fatal: Not a git repository (or any of the parent directories): .git
Process exited with error(s)    
fatal: Not a git repository (or any of the parent directories): .git
Process exited with error(s)
fatal: Not a git repository (or any of the parent directories): .git
Process exited with error(s)
fatal: could not create work tree dir '/NewProject': Permission denied
/.git: Permission denied
Process exited with error(s)
Process exited with error(s)
Process exited normally

答案1

buildmanager.runCommand()不等待命令终止。如果您需要该控制,则应改用system()。它会返回一个进程对象,然后您可以控制该对象(有关详细信息,请参阅手册)。

在您的特定情况下,这仍然有点繁琐,因为您希望在文件目录中执行命令。截至目前(TXS 2.10.8),的工作目录system()是 TeXstudio 的工作目录。因此,您要么必须从所需目录中的 shell 启动 TeXstudio,要么必须将 git 调用包装在首先更改目录的 shell 脚本中。

未来的版本将允许使用可选的第二个参数来system()提供工作目录。

filename = editor.fileName()
workdir = filename.substring(0, filename.lastIndexOf("/"))
proc = system("git init", workdir)
proc.waitForFinished()
...

答案2

这是一个解决方法,直到 TeXStudio 允许在其system()命令中使用参数(请参阅Tim Hoffmann 的回答了解详情)。

接下来的工作基本上是这样的:一个 shell 脚本将工作目录更改为所需路径,使用 Node GH 创建具有所需名称的远程存储库并将其克隆到工作目录。工作目录和存储库名称通过两个输入对话框作为参数传递给脚本。

%SCRIPT
choisedialog = UniversalInputDialog()
choisedialog.setWindowTitle("Repo Name")
choisedialog.add(editor.fileName(), "New Repository:", "name")
if (choisedialog.exec() != null) {
    dialog = new UniversalInputDialog()
    dialog.setWindowTitle("Working Dir")
    dialog.add(editor.fileName(), "Dir path:", "dir")
    if (dialog.exec() != null) {
        repoName = choisedialog.get("name")
        workDir = dialog.get("dir")
        system("sh /Users/nikko/git/scripts/createRepo.sh " + repoName + " \"" + workDir + "\"")
        }
}

创建Repo.sh:

#!/bin/bash
#make sure you clone the generic repo on an empty folder,
#otherwise git will complain.

file="$1"
dir="$2"

cd "$dir"
gh re --new "$file" --type private  \
&& git clone https://github.com/user/genericRepoName.git . \
&& git remote set-url origin https://github.com/user/"$file".git \
&& git push origin master  \
&& git push --all

相关内容