Skip to content

Commit

Permalink
clone all script (nushell#781)
Browse files Browse the repository at this point in the history
Hi! I did a script to clone multiple repos of github in a single folder
I clone everything I intend to work when I reset my pc

Instructions incluided!
  • Loading branch information
AucaCoyan committed Mar 10, 2024
1 parent 5e51b23 commit 1ccc379
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 0 deletions.
64 changes: 64 additions & 0 deletions modules/clone-all/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Clone all

Do you want to automate cloning a list repos into a folder? This script is for you!

## Requirements:
- [`gh` cli](https://github.com/cli/cli)

## How to use it

Load the script:

- if you have cloned the repo before:

```nushell env.nu
source ~/your/directory/to/nu_scripts/modules/clone-all/clone-all.nu
```

or if you have the file, and you want it to use in a nushell session:

```nushell
use clone-all.nu *
# and it's ready to use in the current prompt!
```

Then, create a list of github routes to repositories `ORGANIZATION_NAME/REPO`
like this:

```nu
let list_of_repos = [
"nushell/nushell"
"nushell/nu_scripts"
"nushell/vscode-nushell-lang"
]
```

And then you need to pass that variable and a destination folder

```nu
clone all $list_of_repos $"($env.home)/other-repos/nu_repos"
```

## Tips

I (@AucaCoyan) use it for cloning both org repos and my forks

```nushell
let nushell_repos = [
"nushell/nushell"
"nushell/nu_scripts"
"nushell/vscode-nushell-lang"
]
clone all $nushell_repos $"($env.home)/other-repos/nu"
let nushell_forks = [
"AucaCoyan/nushell"
"AucaCoyan/nu_scripts"
"AucaCoyan/vscode-nushell-lang"
]
clone all $nushell_forks $"($env.home)/repos"
```

and do that with every gh org (work or open source!)
47 changes: 47 additions & 0 deletions modules/clone-all/clone-all.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# grabs the repo name of a github (ORG/repo) string
#
# for exaple
# grab repo name "organization/my_special_repo"
# returns "myspecial_repo"

# Grabs the repo name of a github (ORG/repo) string
def "grab repo name" [ghrepo: string]: [string -> string] {
$ghrepo | split column "/" | get column2 | last
}

# Generic fn to clone all repos of one organization into a specific folder
#
# # Parameters
# `list_of_repos` is a list of <ORG/REPO> from github
# for example:
# ```nu
# let list_of_repos = [
# "nushell/nushell"
# "nushell/nu_scripts"
# "nushell/vscode-nushell-lang"
# ]
#
# and destination is the location where those repos are cloned
# $ use clone-all.nu *
# $ clone all ['nushell/nu_scripts'] /home/my-dir/
# equals
# gh repo clone nushell/nu_scripts /home/my-dir/nu_scripts
# (note that it doesn't create the organization folder)

# Clones all the `list_of_repos` into `destination` folder
export def "clone all" [list_of_repos: list<string>, destination: path] {
print $" creating ($destination) folder"
mkdir $destination

for $repo in $list_of_repos {
let repo_name = grab repo name $repo
let single_repo_dir = $"($destination)/($repo_name)"
if ($single_repo_dir | path exists) {
print $"\n repo ($single_repo_dir) exists, skipping"
continue
} else {
print $"\n cloning ($repo)"
gh repo clone $repo $single_repo_dir
}
}
}

0 comments on commit 1ccc379

Please sign in to comment.