This commit is contained in:
2025-07-25 10:47:17 +02:00
parent 5cee9a4d5a
commit 9b86f76eaa
5 changed files with 199 additions and 287 deletions

View File

@@ -1,33 +0,0 @@
module gitresolver
// GitUrlResolver interface defines the contract for resolving git URLs to local paths
pub interface GitUrlResolver {
// get_repo_path resolves a git URL to a local repository path
// and optionally pulls/resets the repository
get_repo_path(url string, pull bool, reset bool) !string
}
// Global registry for git URL resolver implementation
__global (
git_resolver ?GitUrlResolver
)
// register_resolver sets the global git URL resolver implementation
pub fn register_resolver(resolver GitUrlResolver) {
git_resolver = resolver
}
// get_resolver returns the registered git URL resolver
pub fn get_resolver() !GitUrlResolver {
if resolver := git_resolver {
return resolver
} else {
return error('No git URL resolver has been registered. Make sure to import and initialize the gittools module.')
}
}
// resolve_git_url is a convenience function that uses the registered resolver
pub fn resolve_git_url(url string, pull bool, reset bool) !string {
resolver := get_resolver()!
return resolver.get_repo_path(url, pull, reset)
}

View File

@@ -3,7 +3,6 @@ module playbook
import freeflowuniverse.herolib.core.texttools import freeflowuniverse.herolib.core.texttools
import freeflowuniverse.herolib.data.paramsparser import freeflowuniverse.herolib.data.paramsparser
import freeflowuniverse.herolib.core.pathlib import freeflowuniverse.herolib.core.pathlib
import freeflowuniverse.herolib.core.gitresolver
// import freeflowuniverse.herolib.core.base // import freeflowuniverse.herolib.core.base
// import freeflowuniverse.herolib.ui.console // import freeflowuniverse.herolib.ui.console

View File

@@ -1,54 +1,213 @@
module playcmds module playcmds
import freeflowuniverse.herolib.develop.gittools import freeflowuniverse.herolib.develop.gittools
import freeflowuniverse.herolib.core.playbook import freeflowuniverse.herolib.core.playbook { PlayBook }
import freeflowuniverse.herolib.ui.console import freeflowuniverse.herolib.ui.console
pub fn play_git(mut plbook playbook.PlayBook) ! { @[params]
for action in plbook.find(filter: 'gittools.*')! { pub struct PlayArgs {
play_git_action(action)! pub mut:
} heroscript string
heroscript_path string
plbook ?PlayBook
reset bool
} }
pub fn play_git_action(action playbook.Action) !playbook.Action { pub fn play(args_ PlayArgs) ! {
// console.print_debug("play git action: ${action}") mut args := args_
mut p := action.params mut plbook := args.plbook or {
mut repo := p.get_default('repo', '')! playbook.new(text: args.heroscript, path: args.heroscript_path)!
mut account := p.get_default('account', '')!
mut provider := p.get_default('provider', '')!
// mut filter := p.get_default('filter', '')!
mut url := p.get_default('url', '')!
mut cmd := action.name
mut coderoot := ''
if p.exists('coderoot') {
coderoot = p.get_path_create('coderoot')!
} }
if (repo == '' || account == '' || provider == '') && url == '' { // Handle !!git.define action first to configure GitStructure
return error('need to specify repo, account and provider if url is not specified') define_actions := plbook.find(filter: 'git.define')!
mut gs := if define_actions.len > 0 {
mut p := define_actions[0].params
coderoot := p.get_default('coderoot', '')!
light := p.get_default_true('light')
log := p.get_default_true('log')
debug := p.get_default_false('debug')
offline := p.get_default_false('offline')
ssh_key_path := p.get_default('ssh_key_path', '')!
reload := p.get_default_false('reload')
new(
coderoot: coderoot
light: light
log: log
debug: debug
offline: offline
ssh_key_path: ssh_key_path
reload: reload
)!
} else {
// Initialize GitStructure with defaults
new()!
} }
mut gs := gittools.get(coderoot: coderoot) or { // Handle !!git.clone action
return error("Could not load gittools on '${coderoot}'\n${err}") clone_actions := plbook.find(filter: 'git.clone')!
for action in clone_actions {
mut p := action.params
url := p.get('url')!
coderoot := p.get_default('coderoot', '')!
sshkey := p.get_default('sshkey', '')!
light := p.get_default_true('light')
recursive := p.get_default_false('recursive')
mut clone_args := GitCloneArgs{
url: url
sshkey: sshkey
recursive: recursive
light: light
}
if coderoot.len > 0 {
gs = new(coderoot: coderoot)!
}
gs.clone(clone_args)!
} }
gitpath := gs.do( // Handle !!git.repo_action
cmd: cmd repo_actions := plbook.find(filter: 'git.repo_action')!
filter: action.params.get_default('filter', '')! for action in repo_actions {
repo: repo mut p := action.params
account: account filter_str := p.get_default('filter', '')!
provider: provider name := p.get_default('name', '')!
script: action.params.get_default_false('script') account := p.get_default('account', '')!
reset: action.params.get_default_false('reset') provider := p.get_default('provider', '')!
pull: action.params.get_default_false('pull') action_type := p.get('action')!
msg: action.params.get_default('message', '')! message := p.get_default('message', '')!
url: url branchname := p.get_default('branchname', '')!
)! tagname := p.get_default('tagname', '')!
console.print_debug('play git action: ${cmd} ${account}:${repo} path:${gitpath}') submodules := p.get_default_false('submodules')
mut action2 := action error_ignore := p.get_default_false('error_ignore')
action2.params.set('path', gitpath)
action2.done = true mut repos := gs.get_repos(
return action2 filter: filter_str
name: name
account: account
provider: provider
)!
if repos.len == 0 {
if !error_ignore {
return error('No repositories found for git.repo_action with filter: ${filter_str}, name: ${name}, account: ${account}, provider: ${provider}')
}
console.print_stderr('No repositories found for git.repo_action with filter: ${filter_str}, name: ${name}, account: ${account}, provider: ${provider}. Ignoring due to error_ignore: true.')
continue
}
for mut repo in repos {
match action_type {
'pull' {
repo.pull(submodules: submodules) or {
if !error_ignore {
return error('Failed to pull repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to pull repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'commit' {
repo.commit(message) or {
if !error_ignore {
return error('Failed to commit repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to commit repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'push' {
repo.push() or {
if !error_ignore {
return error('Failed to push repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to push repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'reset' {
repo.reset() or {
if !error_ignore {
return error('Failed to reset repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to reset repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'branch_create' {
repo.branch_create(branchname) or {
if !error_ignore {
return error('Failed to create branch ${branchname} in repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to create branch ${branchname} in repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'branch_switch' {
repo.branch_switch(branchname) or {
if !error_ignore {
return error('Failed to switch branch to ${branchname} in repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to switch branch to ${branchname} in repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'tag_create' {
repo.tag_create(tagname) or {
if !error_ignore {
return error('Failed to create tag ${tagname} in repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to create tag ${tagname} in repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'tag_switch' {
repo.tag_switch(tagname) or {
if !error_ignore {
return error('Failed to switch tag to ${tagname} in repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to switch tag to ${tagname} in repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'delete' {
repo.delete() or {
if !error_ignore {
return error('Failed to delete repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to delete repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
else {
if !error_ignore {
return error('Unknown git.repo_action: ${action_type}')
}
console.print_stderr('Unknown git.repo_action: ${action_type}. Ignoring due to error_ignore: true.')
}
}
}
}
// Handle !!git.list
list_actions := plbook.find(filter: 'git.list')!
for action in list_actions {
mut p := action.params
filter_str := p.get_default('filter', '')!
name := p.get_default('name', '')!
account := p.get_default('account', '')!
provider := p.get_default('provider', '')!
status_update := p.get_default_false('status_update')
gs.repos_print(
filter: filter_str
name: name
account: account
provider: provider
status_update: status_update
)!
}
// Handle !!git.reload_cache
reload_cache_actions := plbook.find(filter: 'git.reload_cache')!
for action in reload_cache_actions {
mut p := action.params
coderoot := p.get_default('coderoot', '')!
if coderoot.len > 0 {
gs = new(coderoot: coderoot)!
}
gs.load(true)! // Force reload
}
} }

View File

@@ -3,7 +3,6 @@ module gittools
import os import os
import json import json
import freeflowuniverse.herolib.core.pathlib import freeflowuniverse.herolib.core.pathlib
import freeflowuniverse.herolib.core.gitresolver
__global ( __global (
gsinstances map[string]&GitStructure gsinstances map[string]&GitStructure

View File

@@ -1,212 +0,0 @@
module gittools
import freeflowuniverse.herolib.core.playbook { PlayBook }
import freeflowuniverse.herolib.ui.console
@[params]
pub struct PlayArgs {
pub mut:
heroscript string
heroscript_path string
plbook ?PlayBook
reset bool
}
pub fn play(args_ PlayArgs) ! {
mut args := args_
mut plbook := args.plbook or {
playbook.new(text: args.heroscript, path: args.heroscript_path)!
}
// Handle !!git.define action first to configure GitStructure
define_actions := plbook.find(filter: 'git.define')!
mut gs := if define_actions.len > 0 {
mut p := define_actions[0].params
coderoot := p.get_default('coderoot', '')!
light := p.get_default_true('light')
log := p.get_default_true('log')
debug := p.get_default_false('debug')
offline := p.get_default_false('offline')
ssh_key_path := p.get_default('ssh_key_path', '')!
reload := p.get_default_false('reload')
new(
coderoot: coderoot
light: light
log: log
debug: debug
offline: offline
ssh_key_path: ssh_key_path
reload: reload
)!
} else {
// Initialize GitStructure with defaults
new()!
}
// Handle !!git.clone action
clone_actions := plbook.find(filter: 'git.clone')!
for action in clone_actions {
mut p := action.params
url := p.get('url')!
coderoot := p.get_default('coderoot', '')!
sshkey := p.get_default('sshkey', '')!
light := p.get_default_true('light')
recursive := p.get_default_false('recursive')
mut clone_args := GitCloneArgs{
url: url
sshkey: sshkey
recursive: recursive
light: light
}
if coderoot.len > 0 {
gs = new(coderoot: coderoot)!
}
gs.clone(clone_args)!
}
// Handle !!git.repo_action
repo_actions := plbook.find(filter: 'git.repo_action')!
for action in repo_actions {
mut p := action.params
filter_str := p.get_default('filter', '')!
name := p.get_default('name', '')!
account := p.get_default('account', '')!
provider := p.get_default('provider', '')!
action_type := p.get('action')!
message := p.get_default('message', '')!
branchname := p.get_default('branchname', '')!
tagname := p.get_default('tagname', '')!
submodules := p.get_default_false('submodules')
error_ignore := p.get_default_false('error_ignore')
mut repos := gs.get_repos(
filter: filter_str
name: name
account: account
provider: provider
)!
if repos.len == 0 {
if !error_ignore {
return error('No repositories found for git.repo_action with filter: ${filter_str}, name: ${name}, account: ${account}, provider: ${provider}')
}
console.print_stderr('No repositories found for git.repo_action with filter: ${filter_str}, name: ${name}, account: ${account}, provider: ${provider}. Ignoring due to error_ignore: true.')
continue
}
for mut repo in repos {
match action_type {
'pull' {
repo.pull(submodules: submodules) or {
if !error_ignore {
return error('Failed to pull repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to pull repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'commit' {
repo.commit(message) or {
if !error_ignore {
return error('Failed to commit repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to commit repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'push' {
repo.push() or {
if !error_ignore {
return error('Failed to push repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to push repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'reset' {
repo.reset() or {
if !error_ignore {
return error('Failed to reset repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to reset repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'branch_create' {
repo.branch_create(branchname) or {
if !error_ignore {
return error('Failed to create branch ${branchname} in repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to create branch ${branchname} in repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'branch_switch' {
repo.branch_switch(branchname) or {
if !error_ignore {
return error('Failed to switch branch to ${branchname} in repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to switch branch to ${branchname} in repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'tag_create' {
repo.tag_create(tagname) or {
if !error_ignore {
return error('Failed to create tag ${tagname} in repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to create tag ${tagname} in repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'tag_switch' {
repo.tag_switch(tagname) or {
if !error_ignore {
return error('Failed to switch tag to ${tagname} in repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to switch tag to ${tagname} in repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
'delete' {
repo.delete() or {
if !error_ignore {
return error('Failed to delete repo ${repo.name}: ${err}')
}
console.print_stderr('Failed to delete repo ${repo.name}: ${err}. Ignoring due to error_ignore: true.')
}
}
else {
if !error_ignore {
return error('Unknown git.repo_action: ${action_type}')
}
console.print_stderr('Unknown git.repo_action: ${action_type}. Ignoring due to error_ignore: true.')
}
}
}
}
// Handle !!git.list
list_actions := plbook.find(filter: 'git.list')!
for action in list_actions {
mut p := action.params
filter_str := p.get_default('filter', '')!
name := p.get_default('name', '')!
account := p.get_default('account', '')!
provider := p.get_default('provider', '')!
status_update := p.get_default_false('status_update')
gs.repos_print(
filter: filter_str
name: name
account: account
provider: provider
status_update: status_update
)!
}
// Handle !!git.reload_cache
reload_cache_actions := plbook.find(filter: 'git.reload_cache')!
for action in reload_cache_actions {
mut p := action.params
coderoot := p.get_default('coderoot', '')!
if coderoot.len > 0 {
gs = new(coderoot: coderoot)!
}
gs.load(true)! // Force reload
}
}