# Tutorials
### Creating a workspace
```console
stefreak@mbp % nut create -d "Change XYZ"
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E %
```
You've now entered your workspace.
Let's import repositories. This will take a while when running the command for the first time, but it will be faster when you run it next time.
This is because the import command is idempotent, and also it will cache common repository data across workspaces.
```console
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut import --skip-forks --user stefreak # or --org xyz
stefreak/buntspiel
Cloning into 'stefreak/buntspiel'...
done.
stefreak/dappcamp-health-plus
Cloning into 'stefreak/dappcamp-health-plus'...
done.
stefreak/garden-playground-exampleapp
Cloning into 'stefreak/garden-playground-exampleapp'...
done.
stefreak/kernel-test
Cloning into 'stefreak/kernel-test'...
done.
stefreak/nut
Cloning into 'stefreak/nut'...
done.
stefreak/ossf-scorecard-repro-2189
Cloning into 'stefreak/ossf-scorecard-repro-2189'...
done.
stefreak/swiftrest
Cloning into 'stefreak/swiftrest'...
done.
```
### Applying commands to a workspace
Now let's implement the change we need across all repositories.
Create a new branch:
```console
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut apply git checkout -b change-xyz
==> stefreak/buntspiel <==
Switched to a new branch 'change-xyz'
==> stefreak/dappcamp-health-plus <==
Switched to a new branch 'change-xyz'
==> stefreak/garden-playground-exampleapp <==
Switched to a new branch 'change-xyz'
==> stefreak/kernel-test <==
Switched to a new branch 'change-xyz'
==> stefreak/nut <==
Switched to a new branch 'change-xyz'
==> stefreak/ossf-scorecard-repro-2189 <==
Switched to a new branch 'change-xyz'
==> stefreak/swiftrest <==
Switched to a new branch 'change-xyz'
```
### The status command
This command helps you to quickly understand what's going on in all repositories.
```console
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut status
Workspace status:
11 repositories total
11 clean, 0 with changes
All repositories are clean.
```
### Running scripts
Of course you can make changes yourself (for example in your favourite code editor).
Sometimes it's useful to run a script to automate decision making.
The script will run inside the repository.
```console
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % cat ~/change-xyz.sh
#!/bin/sh
touch XYZ.md
echo Created new file XYZ.md
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut apply -s ~/change-xyz.sh
==> stefreak/buntspiel <==
Created new file XYZ.md
==> stefreak/dappcamp-health-plus <==
Created new file XYZ.md
==> stefreak/garden-playground-exampleapp <==
Created new file XYZ.md
==> stefreak/kernel-test <==
Created new file XYZ.md
==> stefreak/nut <==
Created new file XYZ.md
==> stefreak/ossf-scorecard-repro-2189 <==
Created new file XYZ.md
==> stefreak/swiftrest <==
Created new file XYZ.md
```
Use the status command to keep track of what's going on.
```console
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut status
Workspace status:
7 repositories total
0 clean, 7 with changes
Repositories with changes:
stefreak/buntspiel (change-xyz)
1 untracked file(s)
stefreak/dappcamp-health-plus (change-xyz)
1 untracked file(s)
stefreak/garden-playground-exampleapp (change-xyz)
1 untracked file(s)
stefreak/kernel-test (change-xyz)
1 untracked file(s)
stefreak/nut (change-xyz)
1 untracked file(s)
stefreak/ossf-scorecard-repro-2189 (change-xyz)
1 untracked file(s)
stefreak/swiftrest (change-xyz)
1 untracked file(s)
```
Let's add and commit the changes:
```console
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut apply git add .
==> stefreak/buntspiel <==
==> stefreak/dappcamp-health-plus <==
==> stefreak/garden-playground-exampleapp <==
==> stefreak/kernel-test <==
==> stefreak/nut <==
==> stefreak/ossf-scorecard-repro-2189 <==
==> stefreak/swiftrest <==
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut apply git commit -m "Change XYZ"
==> stefreak/buntspiel <==
[change-xyz 62f055f] Change XYZ
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 XYZ.md
==> stefreak/dappcamp-health-plus <==
[change-xyz f647749] Change XYZ
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 XYZ.md
==> stefreak/garden-playground-exampleapp <==
[change-xyz 5e85c2e] Change XYZ
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 XYZ.md
==> stefreak/kernel-test <==
[change-xyz 49bc2b8] Change XYZ
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 XYZ.md
==> stefreak/nut <==
[change-xyz fe0a7f5] Change XYZ
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 XYZ.md
==> stefreak/ossf-scorecard-repro-2189 <==
[change-xyz 1928926] Change XYZ
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 XYZ.md
==> stefreak/swiftrest <==
[change-xyz f2a6765] Change XYZ
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 XYZ.md
```
### Managing pull requests
You can create pull requests using the [official GitHub CLI](https://cli.github.com/):
```console
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut apply sh -c "git push -u origin HEAD && gh pr create --fill"
==> stefreak/buntspiel <==
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 10 threads
Compressing objects: 100% (2/2), done.
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:stefreak/buntspiel.git
6c5e9d0..62f055f HEAD -> change-xyz
branch 'change-xyz' set up to track 'origin/change-xyz'.
Creating pull request for change-xyz into main in stefreak/buntspiel
https://github.com/stefreak/buntspiel/pull/2
==> stefreak/dappcamp-health-plus <==
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 10 threads
Compressing objects: 100% (2/2), done.
To github.com:stefreak/dappcamp-health-plus.git
bd7a6eb..f647749 HEAD -> change-xyz
branch 'change-xyz' set up to track 'origin/change-xyz'.
Creating pull request for change-xyz into main in stefreak/dappcamp-health-plus
https://github.com/stefreak/dappcamp-health-plus/pull/2
==> stefreak/garden-playground-exampleapp <==
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 10 threads
Compressing objects: 100% (2/2), done.
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:stefreak/garden-playground-exampleapp.git
31103c7..5e85c2e HEAD -> change-xyz
branch 'change-xyz' set up to track 'origin/change-xyz'.
Creating pull request for change-xyz into master in stefreak/garden-playground-exampleapp
https://github.com/stefreak/garden-playground-exampleapp/pull/2
==> stefreak/kernel-test <==
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
To github.com:stefreak/kernel-test.git
b37b9ad..49bc2b8 HEAD -> change-xyz
branch 'change-xyz' set up to track 'origin/change-xyz'.
Creating pull request for change-xyz into test-foo in stefreak/kernel-test
https://github.com/stefreak/kernel-test/pull/1
==> stefreak/nut <==
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 10 threads
Compressing objects: 100% (2/2), done.
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:stefreak/nut.git
9a4fba7..fe0a7f5 HEAD -> change-xyz
branch 'change-xyz' set up to track 'origin/change-xyz'.
Creating pull request for change-xyz into main in stefreak/nut
https://github.com/stefreak/nut/pull/24
==> stefreak/ossf-scorecard-repro-2189 <==
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 10 threads
Compressing objects: 100% (2/2), done.
To github.com:stefreak/ossf-scorecard-repro-2189.git
444bf5e..1928926 HEAD -> change-xyz
branch 'change-xyz' set up to track 'origin/change-xyz'.
Creating pull request for change-xyz into main in stefreak/ossf-scorecard-repro-2189
https://github.com/stefreak/ossf-scorecard-repro-2189/pull/2
==> stefreak/swiftrest <==
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 10 threads
Compressing objects: 100% (2/2), done.
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:stefreak/swiftrest.git
0213703..f2a6765 HEAD -> change-xyz
branch 'change-xyz' set up to track 'origin/change-xyz'.
Creating pull request for change-xyz into master in stefreak/swiftrest
https://github.com/stefreak/swiftrest/pull/2
```
You can even manage existing PRs. We want to close these test PRs now to conclude the tutorial:
```console
stefreak@mbp 01KBA98F91YBRNH3ARWJJSSA9E % nut apply gh pr close change-xyz -d -c "this was a test"
==> stefreak/buntspiel <==
✓ Closed pull request stefreak/buntspiel#2 (Change XYZ)
✓ Deleted branch change-xyz and switched to branch main
==> stefreak/dappcamp-health-plus <==
✓ Closed pull request stefreak/dappcamp-health-plus#2 (Change XYZ)
✓ Deleted branch change-xyz and switched to branch main
==> stefreak/garden-playground-exampleapp <==
✓ Closed pull request stefreak/garden-playground-exampleapp#2 (Change XYZ)
✓ Deleted branch change-xyz and switched to branch master
==> stefreak/kernel-test <==
✓ Closed pull request stefreak/kernel-test#1 (Change XYZ)
✓ Deleted branch change-xyz and switched to branch test-foo
==> stefreak/nut <==
✓ Closed pull request stefreak/nut#24 (Change XYZ)
✓ Deleted branch change-xyz and switched to branch main
==> stefreak/ossf-scorecard-repro-2189 <==
✓ Closed pull request stefreak/ossf-scorecard-repro-2189#2 (Change XYZ)
✓ Deleted branch change-xyz and switched to branch main
==> stefreak/swiftrest <==
✓ Closed pull request stefreak/swiftrest#2 (Change XYZ)
✓ Deleted branch change-xyz and switched to branch master
```