Switch from Bash to Rust #1
					 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