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