use crate::command_branch_table::{
COPY, COPY_FORCE, DELETE, DELETE_FORCE, DELETE_MERGED, DRY_RUN, EDIT_DESCRIPTION, FILTER, KIND,
LIST, MOVE, MOVE_FORCE, POINTS_AT, RECURSE_SUBMODULES, SET_UPSTREAM, SET_UPSTREAM_TO,
SHOW_CURRENT, TRACK, UNSET_UPSTREAM,
};
use crate::command_options::ParsedOptions;
use crate::command_options_query::{is_enabled, is_stated};
fn track_is_override(parsed: &ParsedOptions) -> bool {
let mut is_override: bool = false;
for occurrence in &parsed.occurrences {
if occurrence.id == SET_UPSTREAM {
is_override = !occurrence.negated;
}
if occurrence.id == TRACK {
is_override = false;
}
}
return is_override;
}
fn count_true(flags: &[bool]) -> usize {
let mut count: usize = 0;
for flag in flags {
if *flag {
count += 1;
}
}
return count;
}
pub(crate) fn branch_creates(parsed: &ParsedOptions, positional_count: usize) -> bool {
let delete: bool = is_enabled(parsed, DELETE) || is_stated(parsed, DELETE_FORCE);
let rename: bool = is_enabled(parsed, MOVE) || is_stated(parsed, MOVE_FORCE);
let copy: bool = is_enabled(parsed, COPY) || is_stated(parsed, COPY_FORCE);
let new_upstream: bool = is_enabled(parsed, SET_UPSTREAM_TO);
let show_current: bool = is_enabled(parsed, SHOW_CURRENT);
let edit_description: bool = is_enabled(parsed, EDIT_DESCRIPTION);
let unset_upstream: bool = is_enabled(parsed, UNSET_UPSTREAM);
let delete_merged: bool = is_stated(parsed, DELETE_MERGED);
let filtered: bool = is_stated(parsed, FILTER) || is_enabled(parsed, POINTS_AT);
let selected: usize = count_true(&[
delete,
rename,
copy,
new_upstream,
show_current,
edit_description,
unset_upstream,
delete_merged,
]);
let list: bool = is_enabled(parsed, LIST) || filtered;
let actions: usize = selected + count_true(&[list]);
if actions > 1 {
return false;
}
if is_enabled(parsed, DRY_RUN) && !delete_merged {
return false;
}
if is_enabled(parsed, RECURSE_SUBMODULES) && actions != 0 {
return false;
}
let named: bool = positional_count == 1 || positional_count == 2;
if copy {
return named;
}
if actions != 0 {
return false;
}
return named && !is_stated(parsed, KIND) && !track_is_override(parsed);
}