(feat): rust rewrite of script
This commit is contained in:
parent
4b4887ba70
commit
f2b1814abd
6 changed files with 91 additions and 27 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clone_repos"
|
||||||
|
version = "0.1.0"
|
||||||
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "clone_repos"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
BIN
clone_repos
Executable file
BIN
clone_repos
Executable file
Binary file not shown.
|
|
@ -1,27 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Prompt for Github username
|
|
||||||
|
|
||||||
read -p "Enter your Github username: " GITHUB_USER
|
|
||||||
|
|
||||||
# Prompt for directory for cloning
|
|
||||||
|
|
||||||
read -p "Enter the directory where you want to clone the repos: " CLONE_DIR
|
|
||||||
|
|
||||||
# Create the directory if not present
|
|
||||||
mkdir -p "$CLONE_DIR"
|
|
||||||
|
|
||||||
# Nav to directory
|
|
||||||
cd "$CLONE_DIR" || exit
|
|
||||||
|
|
||||||
# Fetch all repos
|
|
||||||
|
|
||||||
repos=$(gh repo list "$GITHUB_USER" --limit 100 --json nameWithOwner --jq '.[].nameWithOwner')
|
|
||||||
|
|
||||||
for repo in $repos; do
|
|
||||||
git clone "git@github.com:$repo.git"
|
|
||||||
echo "$repo has been cloned"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "All repos have been cloned into $CLONE_DIR"
|
|
||||||
|
|
||||||
77
src/main.rs
Normal file
77
src/main.rs
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
use std::env;
|
||||||
|
use std::fs;
|
||||||
|
use std::io::{self, Write};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
fn main() -> io::Result<()> {
|
||||||
|
// Prompt for GitHub username
|
||||||
|
let mut github_user = String::new();
|
||||||
|
print!("Enter your GitHub username: ");
|
||||||
|
io::stdout().flush()?;
|
||||||
|
io::stdin().read_line(&mut github_user)?;
|
||||||
|
let github_user = github_user.trim();
|
||||||
|
|
||||||
|
// Prompt for directory for cloning
|
||||||
|
let mut clone_dir = String::new();
|
||||||
|
print!("Enter the directory where you want to clone the repos: ");
|
||||||
|
io::stdout().flush()?;
|
||||||
|
io::stdin().read_line(&mut clone_dir)?;
|
||||||
|
let clone_dir = clone_dir.trim();
|
||||||
|
|
||||||
|
// Create the directory if not present
|
||||||
|
fs::create_dir_all(clone_dir)?;
|
||||||
|
|
||||||
|
// Navigate to the directory
|
||||||
|
env::set_current_dir(clone_dir)?;
|
||||||
|
|
||||||
|
// Fetch all repos
|
||||||
|
let output = Command::new("gh")
|
||||||
|
.arg("repo")
|
||||||
|
.arg("list")
|
||||||
|
.arg(github_user)
|
||||||
|
.arg("--limit")
|
||||||
|
.arg("100")
|
||||||
|
.arg("--json")
|
||||||
|
.arg("nameWithOwner")
|
||||||
|
.arg("--jq")
|
||||||
|
.arg(".[].nameWithOwner")
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
if !output.status.success() {
|
||||||
|
eprintln!("Failed to fetch repositories. Make sure 'gh' is installed and configured.");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let repos = String::from_utf8_lossy(&output.stdout);
|
||||||
|
|
||||||
|
for repo in repos.lines() {
|
||||||
|
let repo = repo.trim();
|
||||||
|
|
||||||
|
// Extract the repository name (remove the username part)
|
||||||
|
let repo_name = repo.split('/').nth(1).unwrap_or(repo);
|
||||||
|
let repo_dir = repo_name.replace('/', "_"); // Replace '/' with '_' to avoid invalid directory names
|
||||||
|
let clone_path = format!("{}/{}", clone_dir, repo_dir);
|
||||||
|
|
||||||
|
// Create a subdirectory for the repo
|
||||||
|
fs::create_dir_all(&clone_path)?;
|
||||||
|
|
||||||
|
// Clone the repository into the subdirectory
|
||||||
|
let clone_command = format!("git clone git@github.com:{} {}", repo, clone_path);
|
||||||
|
|
||||||
|
let status = Command::new("sh")
|
||||||
|
.arg("-c")
|
||||||
|
.arg(&clone_command)
|
||||||
|
.status()?;
|
||||||
|
|
||||||
|
if status.success() {
|
||||||
|
println!("{} has been cloned into {}", repo, clone_path);
|
||||||
|
} else {
|
||||||
|
eprintln!("Failed to clone {} into {}", repo, clone_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("All repos have been cloned into {}", clone_dir);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue