forked from vieter-v/vieter
				
			feat(cli): added some filter flags to GitRepo CLI
							parent
							
								
									a39c1aa5eb
								
							
						
					
					
						commit
						401e0291e3
					
				| 
						 | 
				
			
			@ -1,13 +1,14 @@
 | 
			
		|||
module client
 | 
			
		||||
 | 
			
		||||
import models { BuildLog }
 | 
			
		||||
import models { BuildLog, BuildLogFilter }
 | 
			
		||||
import net.http { Method }
 | 
			
		||||
import response { Response }
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
// get_build_logs returns all build logs.
 | 
			
		||||
pub fn (c &Client) get_build_logs() ?Response<[]BuildLog> {
 | 
			
		||||
	data := c.send_request<[]BuildLog>(Method.get, '/api/logs', {})?
 | 
			
		||||
pub fn (c &Client) get_build_logs(filter BuildLogFilter) ?Response<[]BuildLog> {
 | 
			
		||||
	params := models.params_from(filter)
 | 
			
		||||
	data := c.send_request<[]BuildLog>(Method.get, '/api/logs', params)?
 | 
			
		||||
 | 
			
		||||
	return data
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,8 @@ import cli
 | 
			
		|||
import env
 | 
			
		||||
import client
 | 
			
		||||
import console
 | 
			
		||||
import models { BuildLog }
 | 
			
		||||
import time
 | 
			
		||||
import models { BuildLog, BuildLogFilter }
 | 
			
		||||
 | 
			
		||||
struct Config {
 | 
			
		||||
	address string [required]
 | 
			
		||||
| 
						 | 
				
			
			@ -19,21 +20,71 @@ pub fn cmd() cli.Command {
 | 
			
		|||
		commands: [
 | 
			
		||||
			cli.Command{
 | 
			
		||||
				name: 'list'
 | 
			
		||||
				description: 'List the build logs. If a repo ID is provided, only list the build logs for that repo.'
 | 
			
		||||
				description: 'List build logs.'
 | 
			
		||||
				flags: [
 | 
			
		||||
					cli.Flag{
 | 
			
		||||
						name: 'repo'
 | 
			
		||||
						description: 'ID of the Git repo to restrict list to.'
 | 
			
		||||
						name: 'limit'
 | 
			
		||||
						description: 'How many results to return.'
 | 
			
		||||
						flag: cli.FlagType.int
 | 
			
		||||
					},
 | 
			
		||||
					cli.Flag{
 | 
			
		||||
						name: 'offset'
 | 
			
		||||
						description: 'Minimum index to return.'
 | 
			
		||||
						flag: cli.FlagType.int
 | 
			
		||||
					},
 | 
			
		||||
					cli.Flag{
 | 
			
		||||
						name: 'repo'
 | 
			
		||||
						description: 'Only return logs for this repo id.'
 | 
			
		||||
						flag: cli.FlagType.int
 | 
			
		||||
					},
 | 
			
		||||
					cli.Flag{
 | 
			
		||||
						name: 'today'
 | 
			
		||||
						description: 'Only list logs started today (UTC time).'
 | 
			
		||||
						flag: cli.FlagType.bool
 | 
			
		||||
					},
 | 
			
		||||
					cli.Flag{
 | 
			
		||||
						name: 'failed'
 | 
			
		||||
						description: 'Only list logs with non-zero exit codes.'
 | 
			
		||||
						flag: cli.FlagType.bool
 | 
			
		||||
					},
 | 
			
		||||
				]
 | 
			
		||||
				execute: fn (cmd cli.Command) ? {
 | 
			
		||||
					config_file := cmd.flags.get_string('config-file')?
 | 
			
		||||
					conf := env.load<Config>(config_file)?
 | 
			
		||||
 | 
			
		||||
					repo_id := cmd.flags.get_int('repo')?
 | 
			
		||||
					mut filter := BuildLogFilter{}
 | 
			
		||||
 | 
			
		||||
					if repo_id == 0 { list(conf)? } else { list_for_repo(conf, repo_id)? }
 | 
			
		||||
					limit := cmd.flags.get_int('limit')?
 | 
			
		||||
					if limit != 0 {
 | 
			
		||||
						filter.limit = u64(limit)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					offset := cmd.flags.get_int('offset')?
 | 
			
		||||
					if offset != 0 {
 | 
			
		||||
						filter.offset = u64(offset)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					repo_id := cmd.flags.get_int('repo')?
 | 
			
		||||
					if repo_id != 0 {
 | 
			
		||||
						filter.repo = repo_id
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					if cmd.flags.get_bool('today')? {
 | 
			
		||||
						today := time.now()
 | 
			
		||||
 | 
			
		||||
						filter.after = time.new_time(time.Time{
 | 
			
		||||
							year: today.year
 | 
			
		||||
							month: today.month
 | 
			
		||||
							day: today.day
 | 
			
		||||
						})
 | 
			
		||||
						filter.before = filter.after.add_days(1)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					if cmd.flags.get_bool('failed')? {
 | 
			
		||||
						filter.exit_codes = ['!0']
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					list(conf, filter)?
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			cli.Command{
 | 
			
		||||
| 
						 | 
				
			
			@ -75,9 +126,9 @@ fn print_log_list(logs []BuildLog) ? {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// list prints a list of all build logs.
 | 
			
		||||
fn list(conf Config) ? {
 | 
			
		||||
fn list(conf Config, filter BuildLogFilter) ? {
 | 
			
		||||
	c := client.new(conf.address, conf.api_key)
 | 
			
		||||
	logs := c.get_build_logs()?.data
 | 
			
		||||
	logs := c.get_build_logs(filter)?.data
 | 
			
		||||
 | 
			
		||||
	print_log_list(logs)?
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,8 +24,6 @@ pub fn (db &VieterDb) get_build_logs(filter BuildLogFilter) []BuildLog {
 | 
			
		|||
		where_parts << "arch == '$filter.arch'"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	println(filter.exit_codes)
 | 
			
		||||
 | 
			
		||||
	mut parts := []string{}
 | 
			
		||||
 | 
			
		||||
	for exp in filter.exit_codes {
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +31,7 @@ pub fn (db &VieterDb) get_build_logs(filter BuildLogFilter) []BuildLog {
 | 
			
		|||
			code := exp[1..].int()
 | 
			
		||||
 | 
			
		||||
			parts << 'exit_code != $code'
 | 
			
		||||
		}else {
 | 
			
		||||
		} else {
 | 
			
		||||
			code := exp.int()
 | 
			
		||||
 | 
			
		||||
			parts << 'exit_code == $code'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,11 +30,11 @@ pub fn (bl &BuildLog) str() string {
 | 
			
		|||
[params]
 | 
			
		||||
pub struct BuildLogFilter {
 | 
			
		||||
pub mut:
 | 
			
		||||
	limit                u64 = 25
 | 
			
		||||
	offset               u64
 | 
			
		||||
	repo                 int
 | 
			
		||||
	before               time.Time
 | 
			
		||||
	after                time.Time
 | 
			
		||||
	arch                 string
 | 
			
		||||
	limit      u64 = 25
 | 
			
		||||
	offset     u64
 | 
			
		||||
	repo       int
 | 
			
		||||
	before     time.Time
 | 
			
		||||
	after      time.Time
 | 
			
		||||
	arch       string
 | 
			
		||||
	exit_codes []string
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,6 @@ pub fn patch_from_params<T>(mut o T, params map[string]string) ? {
 | 
			
		|||
			} $else $if field.typ is []string {
 | 
			
		||||
				o.$(field.name) = params[field.name].split(',')
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} else if field.attrs.contains('nonull') {
 | 
			
		||||
			return error('Missing parameter: ${field.name}.')
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +41,13 @@ pub fn params_from<T>(o &T) map[string]string {
 | 
			
		|||
	mut out := map[string]string{}
 | 
			
		||||
 | 
			
		||||
	$for field in T.fields {
 | 
			
		||||
		out[field.name] = o.$(field.name).str()
 | 
			
		||||
		$if field.typ is time.Time {
 | 
			
		||||
			out[field.name] = o.$(field.name).unix_time().str()
 | 
			
		||||
		} $else $if field.typ is []string {
 | 
			
		||||
			out[field.name] = o.$(field.name).join(',')
 | 
			
		||||
		} $else {
 | 
			
		||||
			out[field.name] = o.$(field.name).str()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue