CleanUpWiki_v14 - itnett/FTD02H-N GitHub Wiki

C:\WikiMigration>git clone https://github.com/itnett/FTD02N.wiki.git C:\WikiMigration\git\wiki_repo Cloning into 'C:\WikiMigration\git\wiki_repo'... remote: Enumerating objects: 6, done. remote: Counting objects: 100% (6/6), done. remote: Compressing objects: 100% (3/3), done. remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) Receiving objects: 100% (6/6), done.

C:\WikiMigration>cd C:\WikiMigration\git\wiki_repo

C:\WikiMigration\git\wiki_repo>dir Volume in drive C is Windows Volume Serial Number is DA48-71B2

Directory of C:\WikiMigration\git\wiki_repo

27.08.2024 10:53

. 27.08.2024 10:14 .. 27.08.2024 10:53 29 Home.md 27.08.2024 10:53 4 test.md 2 File(s) 33 bytes 2 Dir(s) 107 244 191 744 bytes free

C:\WikiMigration\git\wiki_repo>echo "# Test Page" > TestPage.md

C:\WikiMigration\git\wiki_repo>git add TestPage.md

C:\WikiMigration\git\wiki_repo>git commit -m "Added TestPage.md for verification" [master f00440f] Added TestPage.md for verification 1 file changed, 1 insertion(+) create mode 100644 TestPage.md

C:\WikiMigration\git\wiki_repo>git push origin master Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Delta compression using up to 16 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 348 bytes | 348.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/itnett/FTD02N.wiki.git be479df..f00440f master -> master

C:\WikiMigration\git\wiki_repo>

Flott, da fungerer alt som det skal!

La meg justere skriptet slik at det automatisk håndterer:

  1. Opprettelse av unike README.md-filer for hvert skript: Hver skriptfil som migreres til https://github.com/itnett/FTD02N.git vil få en tilhørende README.md-fil med et unikt navn, slik at de ikke overskrives.

  2. Publisering av Wiki-sider: Oppdaterte Wiki-sider vil automatisk publiseres til https://github.com/itnett/FTD02N.wiki.git, med lenker til relevante skript i koden repoet.

Jeg skal justere og presentere det oppdaterte skriptet slik at du kan kjøre det med full funksjonalitet.

Oppdatert Skript

import os
import re
import subprocess
import datetime
import yaml

# Last inn konfigurasjoner fra input.yml
with open("input.yml", 'r') as stream:
    config = yaml.safe_load(stream)

wiki_repo_url = config['wiki_repo_url']
dump_directory = config['dump_directory']
code_repo_url = config['code_repo_url']
code_repo_directory = config['code_repo_directory']

# Funksjon for å identifisere kjørbar kode i et kjent format
def is_executable_code_block(code_block):
    executable_patterns = [r'^```python', r'^```bash', r'^```sql', r'^```makefile', r'^```shell']
    for pattern in executable_patterns:
        if re.search(pattern, code_block, re.MULTILINE):
            return True
    return False

# Funksjon for å migrere kodeblokker og opprette unike README.md-filer
def migrate_code_blocks(input_dir, output_dir):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for root, _, files in os.walk(input_dir):
        for file in files:
            if file.endswith('.md'):
                file_path = os.path.join(root, file)
                with open(file_path, 'r', encoding='utf-8') as f:
                    content = f.read()

                # Finn alle kodeblokker
                code_blocks = re.findall(r'```.*?```', content, re.DOTALL)

                for index, block in enumerate(code_blocks):
                    if is_executable_code_block(block):
                        # Bestem filtype basert på innholdet
                        if '```python' in block:
                            extension = 'py'
                            folder = "Python"
                        elif '```bash' in block or '```shell' in block:
                            extension = 'sh'
                            folder = "ShellScripts"
                        elif '```sql' in block:
                            extension = 'sql'
                            folder = "SQLScripts"
                        elif '```makefile' in block:
                            extension = 'makefile'
                            folder = "Makefiles"
                        else:
                            continue

                        output_folder = os.path.join(output_dir, folder)
                        if not os.path.exists(output_folder):
                            os.makedirs(output_folder)

                        output_file_path = os.path.join(output_folder, f"{os.path.splitext(file)[0]}_{index}.{extension}")
                        with open(output_file_path, 'w', encoding='utf-8') as code_file:
                            code_file.write(block.strip('`').strip())

                        # Opprett README.md-fil for hver eksportert kode
                        readme_file_path = os.path.join(output_folder, f"{os.path.splitext(file)[0]}_{index}_README.md")
                        with open(readme_file_path, 'w', encoding='utf-8') as readme_file:
                            readme_file.write(f"# README for {os.path.splitext(file)[0]}_{index}\n")
                            readme_file.write(f"Denne koden ble eksportert fra {file_path}\n")
                            readme_file.write(f"Link til denne koden: {output_file_path}\n")
                        
                        print(f"Kode blokk eksportert til {output_file_path} med README {readme_file_path}")

# Funksjon for å oppdatere URL-er i wiki-sidene
def update_wiki_urls(directory, old_base_url, new_base_url):
    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith('.md'):
                file_path = os.path.join(root, file)
                with open(file_path, 'r', encoding='utf-8') as f:
                    content = f.read()

                updated_content = re.sub(old_base_url, new_base_url, content)

                with open(file_path, 'w', encoding='utf-8') as f:
                    f.write(updated_content)
                print(f"Oppdatert URL-er i {file_path}")

# Funksjon for å utføre Git-operasjoner
def git_operations(directory, commit_message, remote="origin", branch="main"):
    os.chdir(directory)
    
    # Legg til filer i staging
    subprocess.run(["git", "add", "."])
    
    # Commit med en beskrivelse
    subprocess.run(["git", "commit", "-m", commit_message])
    
    # Oppdaterer (puller) siste endringer
    subprocess.run(["git", "pull", "--rebase", remote, branch])
    
    # Pusher til remote repository
    subprocess.run(["git", "push", remote, branch])

# Funksjon for å generere en commit-melding med tidsstempel
def generate_commit_message():
    return f"Automatisk oppdatering - {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"

# Hovedløp
repo_directory = dump_directory
output_directory = code_repo_directory

# Kjør migreringen
migrate_code_blocks(repo_directory, output_directory)

# Oppdatere URL-er i wiki-repoet
old_base_url = 'https://github.com/itnett/FTD02H-N.wiki.git'
new_base_url = 'https://github.com/itnett/FTD02N/blob/main/'  # Juster etter behov
update_wiki_urls(repo_directory, old_base_url, new_base_url)

# Git-operasjoner med logging og commit-melding
commit_message_code_repo = generate_commit_message()
commit_message_wiki_repo = generate_commit_message()

git_operations(output_directory, commit_message_code_repo)
git_operations(repo_directory, commit_message_wiki_repo, remote="origin", branch="master")

input.yml

# URL til den originale Wiki-repoen som skal klones
wiki_repo_url: "https://github.com/itnett/FTD02H-N.wiki.git"

# Sti til katalogen hvor den klonede Wiki-repoen skal lagres midlertidig
dump_directory: "C:\\WikiMigration\\git\\code_dump"

# URL til den nye kode-repoen hvor skript skal lagres
code_repo_url: "https://github.com/itnett/FTD02N"

# Sti til katalogen hvor skriptene fra Wiki-repoen skal lagres
code_repo_directory: "C:\\WikiMigration\\git\\code_repo"

Kjør dette oppdaterte skriptet, og det skal nå håndtere alt vi har diskutert. Det vil opprette unike README.md-filer for hvert skript, oppdatere URL-er i wiki-repoet, og publisere både kode- og wiki-repoet til GitHub.

⚠️ **GitHub.com Fallback** ⚠️