FU6P5QLG4GVLHVB4O5TCEPJF4X4FGDUBONQFRYP4U5KEPIYLUWJQC SWWE2R6MVBX5CNM6X3WLXZTSRTU53PBJL7WJSFVF77XBPXDX4COAC EC3TVL4X6VZZVLOKUN63LC73ADPHBHMZO7QMDXGX2ZPURVI4B4XQC KT5UYXGKEEXUHURNOYFVIG7WQ3Y3SJZMM2TP4OSW6NXSXQ5XXRHAC YBJRDOTCX3ZRDB5EVXJBR55FX3CADCSIGMYWNYVC2PD5W3GXR3DQC A5YBC77VWH2LXCZJOPZORQJI5ZYABSCHJWVX5HVNWPM5RABXESLQC 4WO3ZJM2RNYZCBPS7FGYAEBELYD57OSS7LEUYCWGZBCAY272SNQQC W4LFX7IHQ7SDX67ATSGWDB5IN6472ZJDBKY2XZ54SBJEYD5GAT5QC RPCIGCNSMPYGTMTUXJRIJG76L2WLRDHGJJZHE4DJ4UT5RPNZRNPAC MJDGPSHGF62FTVWZBE7MFNJTUQD42OBVJEOSVPBT553UFJLTEMXQC OQ6HSAWHIRTAIIWMDGCTIOK47JDY7QVVAHLRDA2R5TTJKNSBFCWQC WI2BVQ6JOJBM4OC5KSZBMTDPBWESIR7GD72B5TLO7H2SY7QBDHJAC 4ELJZGRJNL6FXB33QTYDNPY57JA3WZPUXKLQRTGSLDM7W65PD3YQC BFN2VHZS7VCBUHQ4S3CQ3LFQV2V4M6VANNAF32XMRFQVWRGYSZ6AC 23SFYK4Q5NKBPJG53PQNPWQH6UOUU2YKJEL7RLXYBRLJOJYV7AWQC OPXFZKEBDHZZLXEJ2JRDYBOJH6YIN7UZNZYHVHMWMQVDTE2ZD53QC 3QVNMRNMI63L2VOFVTMPCVPXH3J4JXLXVTIIPNOMACQCPCAPWILQC PKJCFSBMXXA2H3US47IJEB7QMIYLEKTLGWQUYEZSKCDODDQTD6HQC XSZZB47UXR6KGYFZZQFQR63X2LDKOH6TPNNBRRGHUCI5JJ4JIWVAC 3BK22XE5LPOH2EK5AMRXFXHNQNCJ54HEPYRINHJT4DA7INT32I7AC I56UGW7UUKLSR4753EYRGNROZB5PD522REEOGHVAQOZZTSVRUEEQC YYKXNBFL44LLOBABLXBKOF7IFUIGIEL2SYIPLGDH6UOEY5EZZZSQC 5CYU7UT74NXJWCC36GNQGVBXH676BHBXWZQVIINRMPDEJ27SBRGAC ESMM3FELOBYIX7FUNOU37FYKRJHFU2IMX6LY6EGJTVPTBDU3SEEQC UF5NJKASGMZSZMBUKSUI67B2GIMQFX5SNNQEHHGUBNDBQ2QZZWSAC 7SSBM4UQMYVRL6L3ICYZQPSMYLZZQNMDWH6JKA3KOOSXZDJHESHQC SWDPAGF6BGUA2L6KFP6LAVCA3SX4QA5FOZRLLOAWLNZ6RNCIV4RQC QYDWH7KBIBYZA22PFVZJMZZ3BN65XEYEMVCC6WMVGCZE3A4GQBXAC 5FVZF7XXF4KVBY27SL2WD2ESEECOIM7FJZC7KVKZ4JOVVBUWF43QC B6YUTY3QLUMPXDFM7LHRSPGBQSGH6VNFSQHQXJNGKD5MQKW6P6KAC YKHE3XMWOWPGOWYSISF73MIAKN7WB3AHCV2OA4ECAFPF47YHUXEAC KWTBNTO3QUUE2YADF6SYW6G6ZOKYEWRJQKIWDGZXR33S3YNDVIZQC WXQBBQ2ACNPKCTDF7OTBLP342324ZIOJK42PUO2KT2IYVJ2ETCMAC PTWZYQFRWWUOE2WMQT26CKZKFSHAIJVJS3QWHJFYUFDRRTVPHSUAC UR4J677RWA3OFG6HQTD46BUUE5YFPSBEFCJAEM5OMT4V5A7SBNNQC A6Z4O6RC33HYWP7JIVQ6FDWE4EOCQWQTIGENK2WAHUGSHDDLSA7QC JZXYSIYDPBWQZCAMGDZ5BFMN6SU73EVVDIYEGTDJN6DVOSBNHN4QC OJPGHVC3RFBQ7TTSCZH6URSSATII3TESD74EISDNOTNXXSX7PQMAC 3XRG4BB6V5V4DICZCMOZMLQNTANWKPO7BBRATTXOZLRNSEUQIA5AC WAOGSCOJ5A372BZKHEYD2BCDBCENNVLFYW3INKUOOAZMDADDIFIQC WH57EHNML4OTGQQZBT2SG6SOFTBOD6OJPJYHJVGPH22CSSOE25AAC EJPSD5XO43DWUBBZGNQMY4TMCAXL5EWCGX3OEHUERQ5GRASGWQLQC YK3MOJJLRYEKZ4FUCNJ3YKMTKOINWIYOJKR3ER7IRSGTC7O6FJZQC 7WCB5YQJJZIPUAFHTCQBWNI6ZM5XMIQJAKTLYTR7NOR5NKESRMDQC AZ5D2LQUSYVWVEP7ISFDSZTMZ65UEHZATILMDQ4TYLCKJH4Q3TIAC PKLUHYE4BGIMJKU6VKGBGSHEB2ZT53OYMTFBYCZYCO4J3RVTRXSAC IFQPVMBD552DZ3B5HCM6W6MI2SB6576ZYJNU5KVA3O4YPZAUEFHAC Z752SDILH25A3U3W5VC6FGF5PBK75VTH3TVZVMPQG6RJFTE4QJFAC LFEMJYYDO45ASMQSOJ3TNID7B5UZXDHB3NWFZJXWOAWNBS6GMDEAC 5O4FWCFP4ZPAS7WKSYPHN76ML3O2S4JUOYWOV2ETD4TF2H6KZ6AQC HPSOAD4RXHXU7TSVX2AD5ZDGHMS7HLYNRARWHJCXGGH5RWW7LH6QC K2SQTVJDXCETCK5KXP72JVCKUIK5V4XNBHRUHKRMOF2524D44WUAC N256FH74YJDO7OYYVIHMV54IP7XA23UKVNMBDZ66LT3DRNEXUGYAC 2SLTGWP6FTM7C7BMSYEI2EBD4YTVO2XCIVRPHBJH5XHVLLVR76TAC UPWS6J3BIHQKXSSWHD7CFLJOXWT3MRABFRVQ4T4NRYFALBAKJOOQC VCNKFNUF7OWVSWC6I5D25KUZ3XZZICZ3LHWVPF2N5ZSP7LQ2JOUQC WT3GA27PQ2AOAIGK65O3Q4DMX4AZDVNULBLRL6GF4QW6QCASUEAAC 6YZAVBWU6E5FYOI5JGEIPXGZLIKAW6LS2AOFIQWEE5DMOPPCD5PQC //! Selection of changes to include or exclude in the next record./// Selection can be picked at 3 levels (order matters, from more coarse to/// more fine):////// - overall/// - per file/// - per change in a file////// To determine a pick state for anything from any of these levels, the/// high-levels (first in the list above) take precedence over the more/// fine-grained levels. This is so that fine-grained partial selection is/// preserved even if a state at higher-level is changed to be all included/// or excluded so that it's possible to return back to the partial/// selection.
if file.changes.len() == changes.len() {// The number of of changes in selection is the same as number// of actual changes, we need to have both exclude and include// to be partialfile.changes.values().any(|pick| {has_exclude |= matches!(pick, Pick::Exclude);has_include |= matches!(pick, Pick::Include);has_include && has_exclude})} else {// There is the same number of changes in selection is not the// same as number of actual changes, we only need to find 1// exclusion to be partialfile.changes.values().any(|pick| matches!(pick, Pick::Exclude))}
// We need to have both exclude and include to be partialfile.changes.values().any(|pick| {has_exclude |= matches!(pick, Pick::Exclude);has_include |= matches!(pick, Pick::Include);has_include && has_exclude})
Ok(changed_file)
// NOTE This might be called for log or another channel so the file might// not exist (or at extereme could even change from file to dir or// vice-versa). Hence this information is sadly not 100% reliable, but it's// still better than not having it alllet is_dir = fs::metadata(repo.path.join(&path)).map(|metadata| metadata.is_dir()).unwrap_or_default();let path = file::Path { raw: path, is_dir };Ok((path, diff))
Some(Ok(path_str.into_owned()))
let path = path_str.into_owned();let is_dir = match fs::metadata(repo.path.join(&path)) {Err(e) => {return Some(Err(anyhow::Error::from(e)));}Ok(metadata) => metadata.is_dir(),};Some(Ok(file::Path { raw: path, is_dir }))
|(ix, (file_path, _diffs))| {let state = to_record::determine_file(to_record, file_path, changed_files);
|(ix, (file, _diffs))| {let state = to_record::determine_file(to_record, file);
// Add space to align these with toggle in `Section::Changed`let toggle_space = el(container(text("")).width(checkbox::WIDTH));el(row([toggle_space, el(column(res))]).spacing(CHECKBOX_SPACING))
if path.is_some() {// Add space to align these with toggle in `Section::Changed`let toggle_space =el(container(text("")).width(checkbox::WIDTH));el(row([toggle_space, el(column(res))]).spacing(CHECKBOX_SPACING))} else {el(column(res))}
let to_record_pick =to_record::determine_change(path, *diff_id, to_record);let to_record_toggle = el(checkbox::two_way(to_record_pick).on_press_with(|| {Msg::ToRecord(to_record::Msg::ToggleChange {file: path.to_string(),diff_id: *diff_id,})}));
if let Some(path) = path {let to_record_pick =to_record::determine_change(path, *diff_id, to_record);let to_record_toggle = el(checkbox::two_way(to_record_pick).on_press_with(|| {Msg::ToRecord(to_record::Msg::ToggleChange {path: path.clone(),diff_id: *diff_id,})}));
(file_a.to_owned(), repo::ChangedFile::default()),(file_b.to_owned(), repo::ChangedFile::default()),(file_c.to_owned(), repo::ChangedFile::default()),
(to_path(file_a), repo::ChangedFile::default()),(to_path(file_b), repo::ChangedFile::default()),(to_path(file_c), repo::ChangedFile::default()),
match selection {StatusSelection::Untracked => {ma.push(add_untracked());push_if(can_select_right, right, ma);push_if(can_record, start_record, ma)
if let Some(selection) = selection {match selection {StatusSelection::Untracked => {ma.push(add_untracked());push_if(can_select_right, right, ma);push_if(can_record, start_record, ma)}StatusSelection::Changed => {// Always allow right move for `to_record` selectionma.push(right());push_if(can_record, start_record, ma)}StatusSelection::AddedFromUntracked => {ma.push(rm_added_file());push_if(can_select_right, right, ma);push_if(can_record, start_record, ma)}StatusSelection::LogChange => {push_if(can_select_right, right, ma);ma.push(clipboard_copy_change_hash());push_if(can_record, start_record, ma)}
StatusSelection::AddedFromUntracked => {ma.push(rm_added_file());push_if(can_select_right, right, ma);push_if(can_record, start_record, ma)}StatusSelection::LogChange => {push_if(can_select_right, right, ma);ma.push(clipboard_copy_change_hash());push_if(can_record, start_record, ma)}StatusSelection::Other => {push_if(can_select_right, right, ma);push_if(can_record, start_record, ma)}};
}