create_pr_from_files() { # Constants local TIMESTAMP=$(date +%Y%m%d%H%M%S) # Branch names local temp_branch="pr-${TIMESTAMP}-temp" local pr_branch="pr-${TIMESTAMP}" local origin_branch="development" local current_branch=$(git rev-parse --abbrev-ref HEAD) cleanup() { git checkout "${current_branch}" git checkout "${temp_branch}" -- "${all_files[@]}" git restore --staged . git branch -D "${temp_branch}" } # Function to handle errors handle_error() { local error_msg="$1" echo "Error: ${error_msg}" cleanup return 1 } # Parse arguments while [[ $# -gt 0 ]]; do case $1 in -b | --base) origin_branch="$2" shift 2 ;; *) files+=("$1") shift ;; esac done if [ ${#files[@]} -eq 0 ]; then echo "Usage: create_pr_from_files [ ...] [-b ]" return 1 fi asd=($(for f in "${files[@]}"; do find "${f}" | tr -s '/'; done)) # Initialize an empty array files_to_keep=() # Use a while loop to read each line from the command substitution while IFS= read -r line; do files_to_keep+=("$line") done < <(git status --porcelain | grep -f <(printf "%s\n" "${asd[@]}") | cut -d " " -f 3) # Initialize an empty array all_files=() # Use a while loop to read each line from the command substitution while IFS= read -r line; do all_files+=("$line") done < <(git status --porcelain | cut -d " " -f 3) # Switch to origin branch if not already there if [ "$current_branch" != "$origin_branch" ]; then git checkout "${origin_branch}" fi git checkout -b "${temp_branch}" && git commit -am "Saving changes" || cleanup git checkout "${origin_branch}" && git checkout -b "${pr_branch}" && git checkout "${temp_branch}" -- "${files_to_keep[@]}" || cleanup echo "Generating commit message..." local commit_message=$(git diff --staged | aichat -m ollama:pino-coder -r commitmessage || handle_error "Failed to generate commit message.") # Extract title and body from the generated commit message local commit_subject=$(echo "$commit_message" | head -n 1) local commit_body=$(echo "$commit_message" | tail -n +2) git commit -m "$commit_subject"$'\n\n'"$commit_body" || handle_error "Committing files failed." git push origin "${pr_branch}" # Create PR gh pr create \ --base "${origin_branch}" \ --head "${pr_branch}" \ --title "${commit_subject}" \ --body "${commit_body}" || handle_error "Failed to create pull request" echo "Pull request created successfully." cleanup } create_pr_from_commit() { local commit_hash="$1" local base_branch="${2:-development}" if [ -z "$commit_hash" ]; then echo "Usage: create_pr_from_commit []" return 1 fi # Check for uncommitted changes and stash them if any local has_changes=false if ! git diff --quiet || ! git diff --cached --quiet; then echo "Stashing uncommitted changes..." git stash push -u has_changes=true fi # Create a new branch name based on the commit hash local new_branch="pr-${commit_hash}" # Checkout to the new branch and cherry-pick the commit git checkout "$base_branch" && git checkout -b "$new_branch" if ! git cherry-pick "$commit_hash"; then echo "Cherry-picking failed. Cleaning up." git checkout - git branch -D "$new_branch" if $has_changes; then echo "Restoring stashed changes..." git stash pop fi return 1 fi git push origin "$new_branch" local commit_message=$(git show -s --format=%B "$commit_hash") local commit_subject=$(echo "$commit_message" | head -n 1) local commit_body=$(echo "$commit_message" | tail -n +2) gh pr create --base "$base_branch" --head "$new_branch" --title "$commit_subject" --body "$commit_body" echo "Pull request created successfully." if $has_changes; then echo "Restoring stashed changes..." git stash pop fi }