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