1#![doc(html_root_url = "https://docs.rs/git2/0.21")]
69#![allow(trivial_numeric_casts, trivial_casts)]
70#![deny(missing_docs)]
71#![warn(rust_2018_idioms)]
72#![cfg_attr(test, deny(warnings))]
73
74use bitflags::bitflags;
75use libgit2_sys as raw;
76
77use std::ffi::{CStr, CString};
78use std::fmt;
79use std::str;
80use std::sync::Once;
81
82pub use crate::apply::{ApplyLocation, ApplyOptions};
83pub use crate::attr::AttrValue;
84pub use crate::blame::{Blame, BlameHunk, BlameIter, BlameOptions};
85pub use crate::blob::{Blob, BlobWriter};
86pub use crate::branch::{Branch, Branches};
87pub use crate::buf::Buf;
88pub use crate::cherrypick::CherrypickOptions;
89pub use crate::commit::{Commit, Parents};
90pub use crate::config::{Config, ConfigEntries, ConfigEntry};
91pub use crate::cred::Cred;
92#[cfg(feature = "cred")]
93pub use crate::cred::CredentialHelper;
94pub use crate::describe::{Describe, DescribeFormatOptions, DescribeOptions};
95pub use crate::diff::{Deltas, Diff, DiffDelta, DiffFile, DiffOptions};
96pub use crate::diff::{DiffBinary, DiffBinaryFile, DiffBinaryKind, DiffPatchidOptions};
97pub use crate::diff::{DiffFindOptions, DiffHunk, DiffLine, DiffLineType, DiffStats};
98pub use crate::email::{Email, EmailCreateOptions};
99pub use crate::error::Error;
100pub use crate::index::{
101 Index, IndexConflict, IndexConflicts, IndexEntries, IndexEntry, IndexMatchedPath,
102};
103pub use crate::indexer::{Indexer, IndexerProgress, Progress};
104pub use crate::mailmap::Mailmap;
105pub use crate::mempack::Mempack;
106pub use crate::merge::{
107 merge_file, AnnotatedCommit, MergeFileInput, MergeFileOptions, MergeFileResult, MergeOptions,
108};
109pub use crate::message::{
110 message_prettify, message_trailers_bytes, message_trailers_strs, MessageTrailersBytes,
111 MessageTrailersBytesIterator, MessageTrailersStrs, MessageTrailersStrsIterator,
112 DEFAULT_COMMENT_CHAR,
113};
114pub use crate::note::{Note, Notes};
115pub use crate::object::Object;
116pub use crate::odb::{Odb, OdbObject, OdbPackwriter, OdbReader, OdbWriter};
117pub use crate::oid::ObjectFormat;
118pub use crate::oid::Oid;
119pub use crate::packbuilder::{PackBuilder, PackBuilderStage};
120pub use crate::patch::Patch;
121pub use crate::pathspec::{Pathspec, PathspecFailedEntries, PathspecMatchList};
122pub use crate::pathspec::{PathspecDiffEntries, PathspecEntries};
123pub use crate::proxy_options::ProxyOptions;
124pub use crate::push_update::PushUpdate;
125pub use crate::rebase::{Rebase, RebaseOperation, RebaseOperationType, RebaseOptions};
126pub use crate::refdb::Refdb;
127pub use crate::reference::{Reference, ReferenceNames, References};
128pub use crate::reflog::{Reflog, ReflogEntry, ReflogIter};
129pub use crate::refspec::Refspec;
130pub use crate::remote::{
131 FetchOptions, PushOptions, Refspecs, Remote, RemoteConnection, RemoteHead, RemoteRedirect,
132};
133pub use crate::remote_callbacks::{CertificateCheckStatus, Credentials, RemoteCallbacks};
134pub use crate::remote_callbacks::{TransportMessage, UpdateTips};
135pub use crate::repo::{Repository, RepositoryInitOptions};
136pub use crate::revert::RevertOptions;
137pub use crate::revspec::Revspec;
138pub use crate::revwalk::Revwalk;
139pub use crate::signature::Signature;
140pub use crate::stash::{StashApplyOptions, StashApplyProgressCb, StashCb, StashSaveOptions};
141pub use crate::status::{StatusEntry, StatusIter, StatusOptions, StatusShow, Statuses};
142pub use crate::submodule::{Submodule, SubmoduleUpdateOptions};
143pub use crate::tag::Tag;
144pub use crate::time::{IndexTime, Time};
145pub use crate::tracing::{trace_set, TraceLevel};
146pub use crate::transaction::Transaction;
147pub use crate::tree::{Tree, TreeEntry, TreeIter, TreeWalkMode, TreeWalkResult};
148pub use crate::treebuilder::TreeBuilder;
149pub use crate::util::{Binding, IntoCString};
150pub use crate::version::Version;
151pub use crate::worktree::{Worktree, WorktreeAddOptions, WorktreeLockStatus, WorktreePruneOptions};
152
153macro_rules! is_bit_set {
155 ($name:ident, $flag:expr) => {
156 #[doc = concat!("Check if the ", stringify!($flag), " is set.")]
157 pub fn $name(&self) -> bool {
158 self.intersects($flag)
159 }
160 };
161}
162
163#[derive(PartialEq, Eq, Clone, Debug, Copy)]
172pub enum ErrorCode {
173 GenericError,
175 NotFound,
177 Exists,
179 Ambiguous,
181 BufSize,
183 User,
185 BareRepo,
187 UnbornBranch,
189 Unmerged,
191 NotFastForward,
193 InvalidSpec,
195 Conflict,
197 Locked,
199 Modified,
201 Auth,
203 Certificate,
205 Applied,
207 Peel,
209 Eof,
211 Invalid,
213 Uncommitted,
215 Directory,
217 MergeConflict,
219 HashsumMismatch,
221 IndexDirty,
223 ApplyFail,
225 Owner,
227 Timeout,
229}
230
231#[derive(PartialEq, Eq, Clone, Debug, Copy)]
234pub enum ErrorClass {
235 None,
237 NoMemory,
239 Os,
241 Invalid,
243 Reference,
245 Zlib,
247 Repository,
249 Config,
251 Regex,
253 Odb,
255 Index,
257 Object,
259 Net,
261 Tag,
263 Tree,
265 Indexer,
267 Ssl,
269 Submodule,
271 Thread,
273 Stash,
275 Checkout,
277 FetchHead,
279 Merge,
281 Ssh,
283 Filter,
285 Revert,
287 Callback,
289 CherryPick,
291 Describe,
293 Rebase,
295 Filesystem,
297 Patch,
299 Worktree,
301 Sha1,
303 Http,
305}
306
307#[derive(PartialEq, Eq, Clone, Debug, Copy)]
309pub enum RepositoryState {
310 Clean,
312 Merge,
314 Revert,
316 RevertSequence,
318 CherryPick,
320 CherryPickSequence,
322 Bisect,
324 Rebase,
326 RebaseInteractive,
328 RebaseMerge,
330 ApplyMailbox,
332 ApplyMailboxOrRebase,
334}
335
336#[derive(Copy, Clone, Debug, PartialEq, Eq)]
338pub enum Direction {
339 Fetch,
341 Push,
343}
344
345#[derive(Copy, Clone, Debug, PartialEq, Eq)]
348pub enum ResetType {
349 Soft,
351 Mixed,
353 Hard,
355}
356
357#[derive(PartialEq, Eq, Copy, Clone, Debug)]
359pub enum ObjectType {
360 Any,
362 Commit,
364 Tree,
366 Blob,
368 Tag,
370}
371
372#[derive(PartialEq, Eq, Copy, Clone, Debug)]
374pub enum ReferenceType {
375 Direct,
377
378 Symbolic,
380}
381
382#[derive(PartialEq, Eq, Debug, Copy, Clone)]
384pub enum BranchType {
385 Local,
387 Remote,
389}
390
391#[derive(PartialEq, Eq, Debug, Copy, Clone)]
396pub enum ConfigLevel {
397 ProgramData = 1,
399 System,
401 XDG,
403 Global,
405 Local,
407 Worktree,
409 App,
411 Highest = -1,
413}
414
415#[derive(PartialEq, Eq, Debug, Copy, Clone)]
418pub enum FileFavor {
419 Normal,
423 Ours,
427 Theirs,
431 Union,
435}
436
437bitflags! {
438 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
440 pub struct Sort: u32 {
441 const NONE = raw::GIT_SORT_NONE as u32;
446
447 const TOPOLOGICAL = raw::GIT_SORT_TOPOLOGICAL as u32;
452
453 const TIME = raw::GIT_SORT_TIME as u32;
457
458 const REVERSE = raw::GIT_SORT_REVERSE as u32;
462 }
463}
464
465impl Sort {
466 is_bit_set!(is_none, Sort::NONE);
467 is_bit_set!(is_topological, Sort::TOPOLOGICAL);
468 is_bit_set!(is_time, Sort::TIME);
469 is_bit_set!(is_reverse, Sort::REVERSE);
470}
471
472bitflags! {
473 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
475 pub struct CredentialType: u32 {
476 #[allow(missing_docs)]
477 const USER_PASS_PLAINTEXT = raw::GIT_CREDTYPE_USERPASS_PLAINTEXT as u32;
478 #[allow(missing_docs)]
479 const SSH_KEY = raw::GIT_CREDTYPE_SSH_KEY as u32;
480 #[allow(missing_docs)]
481 const SSH_MEMORY = raw::GIT_CREDTYPE_SSH_MEMORY as u32;
482 #[allow(missing_docs)]
483 const SSH_CUSTOM = raw::GIT_CREDTYPE_SSH_CUSTOM as u32;
484 #[allow(missing_docs)]
485 const DEFAULT = raw::GIT_CREDTYPE_DEFAULT as u32;
486 #[allow(missing_docs)]
487 const SSH_INTERACTIVE = raw::GIT_CREDTYPE_SSH_INTERACTIVE as u32;
488 #[allow(missing_docs)]
489 const USERNAME = raw::GIT_CREDTYPE_USERNAME as u32;
490 }
491}
492
493impl CredentialType {
494 is_bit_set!(is_user_pass_plaintext, CredentialType::USER_PASS_PLAINTEXT);
495 is_bit_set!(is_ssh_key, CredentialType::SSH_KEY);
496 is_bit_set!(is_ssh_memory, CredentialType::SSH_MEMORY);
497 is_bit_set!(is_ssh_custom, CredentialType::SSH_CUSTOM);
498 is_bit_set!(is_default, CredentialType::DEFAULT);
499 is_bit_set!(is_ssh_interactive, CredentialType::SSH_INTERACTIVE);
500 is_bit_set!(is_username, CredentialType::USERNAME);
501}
502
503impl Default for CredentialType {
504 fn default() -> Self {
505 CredentialType::DEFAULT
506 }
507}
508
509bitflags! {
510 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
512 pub struct IndexEntryFlag: u16 {
513 const EXTENDED = raw::GIT_INDEX_ENTRY_EXTENDED as u16;
515 const VALID = raw::GIT_INDEX_ENTRY_VALID as u16;
517 }
518}
519
520impl IndexEntryFlag {
521 is_bit_set!(is_extended, IndexEntryFlag::EXTENDED);
522 is_bit_set!(is_valid, IndexEntryFlag::VALID);
523}
524
525bitflags! {
526 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
528 pub struct IndexEntryExtendedFlag: u16 {
529 const INTENT_TO_ADD = raw::GIT_INDEX_ENTRY_INTENT_TO_ADD as u16;
531 const SKIP_WORKTREE = raw::GIT_INDEX_ENTRY_SKIP_WORKTREE as u16;
533
534 #[allow(missing_docs)]
535 const UPTODATE = raw::GIT_INDEX_ENTRY_UPTODATE as u16;
536 }
537}
538
539impl IndexEntryExtendedFlag {
540 is_bit_set!(is_intent_to_add, IndexEntryExtendedFlag::INTENT_TO_ADD);
541 is_bit_set!(is_skip_worktree, IndexEntryExtendedFlag::SKIP_WORKTREE);
542 is_bit_set!(is_up_to_date, IndexEntryExtendedFlag::UPTODATE);
543}
544
545bitflags! {
546 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
548 pub struct IndexAddOption: u32 {
549 const DEFAULT = raw::GIT_INDEX_ADD_DEFAULT as u32;
551 const FORCE = raw::GIT_INDEX_ADD_FORCE as u32;
553 #[allow(missing_docs)]
554 const DISABLE_PATHSPEC_MATCH =
555 raw::GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH as u32;
556 #[allow(missing_docs)]
557 const CHECK_PATHSPEC = raw::GIT_INDEX_ADD_CHECK_PATHSPEC as u32;
558 }
559}
560
561impl IndexAddOption {
562 is_bit_set!(is_default, IndexAddOption::DEFAULT);
563 is_bit_set!(is_force, IndexAddOption::FORCE);
564 is_bit_set!(
565 is_disable_pathspec_match,
566 IndexAddOption::DISABLE_PATHSPEC_MATCH
567 );
568 is_bit_set!(is_check_pathspec, IndexAddOption::CHECK_PATHSPEC);
569}
570
571impl Default for IndexAddOption {
572 fn default() -> Self {
573 IndexAddOption::DEFAULT
574 }
575}
576
577bitflags! {
578 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
580 pub struct RepositoryOpenFlags: u32 {
581 const NO_SEARCH = raw::GIT_REPOSITORY_OPEN_NO_SEARCH as u32;
583 const CROSS_FS = raw::GIT_REPOSITORY_OPEN_CROSS_FS as u32;
585 const BARE = raw::GIT_REPOSITORY_OPEN_BARE as u32;
587 const NO_DOTGIT = raw::GIT_REPOSITORY_OPEN_NO_DOTGIT as u32;
589 const FROM_ENV = raw::GIT_REPOSITORY_OPEN_FROM_ENV as u32;
591 }
592}
593
594impl RepositoryOpenFlags {
595 is_bit_set!(is_no_search, RepositoryOpenFlags::NO_SEARCH);
596 is_bit_set!(is_cross_fs, RepositoryOpenFlags::CROSS_FS);
597 is_bit_set!(is_bare, RepositoryOpenFlags::BARE);
598 is_bit_set!(is_no_dotgit, RepositoryOpenFlags::NO_DOTGIT);
599 is_bit_set!(is_from_env, RepositoryOpenFlags::FROM_ENV);
600}
601
602bitflags! {
603 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
605 pub struct RevparseMode: u32 {
606 const SINGLE = raw::GIT_REVPARSE_SINGLE as u32;
608 const RANGE = raw::GIT_REVPARSE_RANGE as u32;
610 const MERGE_BASE = raw::GIT_REVPARSE_MERGE_BASE as u32;
612 }
613}
614
615impl RevparseMode {
616 is_bit_set!(is_no_single, RevparseMode::SINGLE);
617 is_bit_set!(is_range, RevparseMode::RANGE);
618 is_bit_set!(is_merge_base, RevparseMode::MERGE_BASE);
619}
620
621bitflags! {
622 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
624 pub struct MergeAnalysis: u32 {
625 const ANALYSIS_NONE = raw::GIT_MERGE_ANALYSIS_NONE as u32;
627 const ANALYSIS_NORMAL = raw::GIT_MERGE_ANALYSIS_NORMAL as u32;
630 const ANALYSIS_UP_TO_DATE = raw::GIT_MERGE_ANALYSIS_UP_TO_DATE as u32;
633 const ANALYSIS_FASTFORWARD = raw::GIT_MERGE_ANALYSIS_FASTFORWARD as u32;
637 const ANALYSIS_UNBORN = raw::GIT_MERGE_ANALYSIS_UNBORN as u32;
641 }
642}
643
644impl MergeAnalysis {
645 is_bit_set!(is_none, MergeAnalysis::ANALYSIS_NONE);
646 is_bit_set!(is_normal, MergeAnalysis::ANALYSIS_NORMAL);
647 is_bit_set!(is_up_to_date, MergeAnalysis::ANALYSIS_UP_TO_DATE);
648 is_bit_set!(is_fast_forward, MergeAnalysis::ANALYSIS_FASTFORWARD);
649 is_bit_set!(is_unborn, MergeAnalysis::ANALYSIS_UNBORN);
650}
651
652bitflags! {
653 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
655 pub struct MergePreference: u32 {
656 const NONE = raw::GIT_MERGE_PREFERENCE_NONE as u32;
659 const NO_FAST_FORWARD = raw::GIT_MERGE_PREFERENCE_NO_FASTFORWARD as u32;
662 const FASTFORWARD_ONLY = raw::GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY as u32;
665 }
666}
667
668impl MergePreference {
669 is_bit_set!(is_none, MergePreference::NONE);
670 is_bit_set!(is_no_fast_forward, MergePreference::NO_FAST_FORWARD);
671 is_bit_set!(is_fastforward_only, MergePreference::FASTFORWARD_ONLY);
672}
673
674bitflags! {
675 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
677 pub struct OdbLookupFlags: u32 {
678 const NO_REFRESH = raw::GIT_ODB_LOOKUP_NO_REFRESH as u32;
683 }
684}
685
686bitflags! {
687 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
689 pub struct RemoteUpdateFlags: u32 {
690 const UPDATE_FETCHHEAD = raw::GIT_REMOTE_UPDATE_FETCHHEAD as u32;
692 const REPORT_UNCHANGED = raw::GIT_REMOTE_UPDATE_REPORT_UNCHANGED as u32;
694 }
695}
696
697#[cfg(test)]
698#[macro_use]
699mod test;
700#[macro_use]
701mod panic;
702mod attr;
703mod call;
704mod util;
705
706pub mod build;
707pub mod cert;
708pub mod oid_array;
709pub mod opts;
710pub mod string_array;
711pub mod transport;
712
713mod apply;
714mod blame;
715mod blob;
716mod branch;
717mod buf;
718mod cherrypick;
719mod commit;
720mod config;
721mod cred;
722mod describe;
723mod diff;
724mod email;
725mod error;
726mod index;
727mod indexer;
728mod mailmap;
729mod mempack;
730mod merge;
731mod message;
732mod note;
733mod object;
734mod odb;
735mod oid;
736mod packbuilder;
737mod patch;
738mod pathspec;
739mod proxy_options;
740mod push_update;
741mod rebase;
742mod refdb;
743mod reference;
744mod reflog;
745mod refspec;
746mod remote;
747mod remote_callbacks;
748mod repo;
749mod revert;
750mod revspec;
751mod revwalk;
752mod signature;
753mod stash;
754mod status;
755mod submodule;
756mod tag;
757mod tagforeach;
758mod time;
759mod tracing;
760mod transaction;
761mod tree;
762mod treebuilder;
763mod version;
764mod worktree;
765
766fn init() {
767 static INIT: Once = Once::new();
768
769 INIT.call_once(|| {
770 openssl_env_init();
771 });
772
773 raw::init();
774}
775
776#[cfg(all(
777 unix,
778 not(target_os = "macos"),
779 not(target_os = "ios"),
780 feature = "https"
781))]
782fn openssl_env_init() {
783 #[allow(deprecated)] openssl_probe::init_ssl_cert_env_vars();
896}
897
898#[cfg(any(
899 windows,
900 target_os = "macos",
901 target_os = "ios",
902 not(feature = "https")
903))]
904fn openssl_env_init() {}
905
906unsafe fn opt_bytes<'a, T>(_anchor: &'a T, c: *const libc::c_char) -> Option<&'a [u8]> {
907 if c.is_null() {
908 None
909 } else {
910 Some(CStr::from_ptr(c).to_bytes())
911 }
912}
913
914fn opt_cstr<T: IntoCString>(o: Option<T>) -> Result<Option<CString>, Error> {
915 match o {
916 Some(s) => s.into_c_string().map(Some),
917 None => Ok(None),
918 }
919}
920
921impl ObjectType {
922 pub fn str(&self) -> &'static str {
924 unsafe {
925 let ptr = call!(raw::git_object_type2string(*self)) as *const _;
926 let data = CStr::from_ptr(ptr).to_bytes();
927 str::from_utf8(data).unwrap()
928 }
929 }
930
931 pub fn is_loose(&self) -> bool {
933 unsafe { call!(raw::git_object_typeisloose(*self)) == 1 }
934 }
935
936 pub fn from_raw(raw: raw::git_object_t) -> Option<ObjectType> {
938 match raw {
939 raw::GIT_OBJECT_ANY => Some(ObjectType::Any),
940 raw::GIT_OBJECT_COMMIT => Some(ObjectType::Commit),
941 raw::GIT_OBJECT_TREE => Some(ObjectType::Tree),
942 raw::GIT_OBJECT_BLOB => Some(ObjectType::Blob),
943 raw::GIT_OBJECT_TAG => Some(ObjectType::Tag),
944 _ => None,
945 }
946 }
947
948 pub fn raw(&self) -> raw::git_object_t {
950 call::convert(self)
951 }
952
953 pub fn from_str(s: &str) -> Option<ObjectType> {
955 let raw = unsafe { call!(raw::git_object_string2type(CString::new(s).unwrap())) };
956 ObjectType::from_raw(raw)
957 }
958}
959
960impl fmt::Display for ObjectType {
961 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
962 self.str().fmt(f)
963 }
964}
965
966impl ReferenceType {
967 pub fn str(&self) -> &'static str {
969 match self {
970 ReferenceType::Direct => "direct",
971 ReferenceType::Symbolic => "symbolic",
972 }
973 }
974
975 pub fn from_raw(raw: raw::git_reference_t) -> Option<ReferenceType> {
977 match raw {
978 raw::GIT_REFERENCE_DIRECT => Some(ReferenceType::Direct),
979 raw::GIT_REFERENCE_SYMBOLIC => Some(ReferenceType::Symbolic),
980 _ => None,
981 }
982 }
983}
984
985impl fmt::Display for ReferenceType {
986 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
987 self.str().fmt(f)
988 }
989}
990
991impl ConfigLevel {
992 pub fn from_raw(raw: raw::git_config_level_t) -> ConfigLevel {
994 match raw {
995 raw::GIT_CONFIG_LEVEL_PROGRAMDATA => ConfigLevel::ProgramData,
996 raw::GIT_CONFIG_LEVEL_SYSTEM => ConfigLevel::System,
997 raw::GIT_CONFIG_LEVEL_XDG => ConfigLevel::XDG,
998 raw::GIT_CONFIG_LEVEL_GLOBAL => ConfigLevel::Global,
999 raw::GIT_CONFIG_LEVEL_LOCAL => ConfigLevel::Local,
1000 raw::GIT_CONFIG_LEVEL_WORKTREE => ConfigLevel::Worktree,
1001 raw::GIT_CONFIG_LEVEL_APP => ConfigLevel::App,
1002 raw::GIT_CONFIG_HIGHEST_LEVEL => ConfigLevel::Highest,
1003 n => panic!("unknown config level: {}", n),
1004 }
1005 }
1006}
1007
1008impl SubmoduleIgnore {
1009 pub fn from_raw(raw: raw::git_submodule_ignore_t) -> Self {
1011 match raw {
1012 raw::GIT_SUBMODULE_IGNORE_UNSPECIFIED => SubmoduleIgnore::Unspecified,
1013 raw::GIT_SUBMODULE_IGNORE_NONE => SubmoduleIgnore::None,
1014 raw::GIT_SUBMODULE_IGNORE_UNTRACKED => SubmoduleIgnore::Untracked,
1015 raw::GIT_SUBMODULE_IGNORE_DIRTY => SubmoduleIgnore::Dirty,
1016 raw::GIT_SUBMODULE_IGNORE_ALL => SubmoduleIgnore::All,
1017 n => panic!("unknown submodule ignore rule: {}", n),
1018 }
1019 }
1020}
1021
1022impl SubmoduleUpdate {
1023 pub fn from_raw(raw: raw::git_submodule_update_t) -> Self {
1025 match raw {
1026 raw::GIT_SUBMODULE_UPDATE_CHECKOUT => SubmoduleUpdate::Checkout,
1027 raw::GIT_SUBMODULE_UPDATE_REBASE => SubmoduleUpdate::Rebase,
1028 raw::GIT_SUBMODULE_UPDATE_MERGE => SubmoduleUpdate::Merge,
1029 raw::GIT_SUBMODULE_UPDATE_NONE => SubmoduleUpdate::None,
1030 raw::GIT_SUBMODULE_UPDATE_DEFAULT => SubmoduleUpdate::Default,
1031 n => panic!("unknown submodule update strategy: {}", n),
1032 }
1033 }
1034}
1035
1036bitflags! {
1037 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1046 pub struct Status: u32 {
1047 #[allow(missing_docs)]
1048 const CURRENT = raw::GIT_STATUS_CURRENT as u32;
1049
1050 #[allow(missing_docs)]
1051 const INDEX_NEW = raw::GIT_STATUS_INDEX_NEW as u32;
1052 #[allow(missing_docs)]
1053 const INDEX_MODIFIED = raw::GIT_STATUS_INDEX_MODIFIED as u32;
1054 #[allow(missing_docs)]
1055 const INDEX_DELETED = raw::GIT_STATUS_INDEX_DELETED as u32;
1056 #[allow(missing_docs)]
1057 const INDEX_RENAMED = raw::GIT_STATUS_INDEX_RENAMED as u32;
1058 #[allow(missing_docs)]
1059 const INDEX_TYPECHANGE = raw::GIT_STATUS_INDEX_TYPECHANGE as u32;
1060
1061 #[allow(missing_docs)]
1062 const WT_NEW = raw::GIT_STATUS_WT_NEW as u32;
1063 #[allow(missing_docs)]
1064 const WT_MODIFIED = raw::GIT_STATUS_WT_MODIFIED as u32;
1065 #[allow(missing_docs)]
1066 const WT_DELETED = raw::GIT_STATUS_WT_DELETED as u32;
1067 #[allow(missing_docs)]
1068 const WT_TYPECHANGE = raw::GIT_STATUS_WT_TYPECHANGE as u32;
1069 #[allow(missing_docs)]
1070 const WT_RENAMED = raw::GIT_STATUS_WT_RENAMED as u32;
1071 #[allow(missing_docs)]
1072 const WT_UNREADABLE = raw::GIT_STATUS_WT_UNREADABLE as u32;
1073
1074 #[allow(missing_docs)]
1075 const IGNORED = raw::GIT_STATUS_IGNORED as u32;
1076 #[allow(missing_docs)]
1077 const CONFLICTED = raw::GIT_STATUS_CONFLICTED as u32;
1078 }
1079}
1080
1081impl Status {
1082 is_bit_set!(is_index_new, Status::INDEX_NEW);
1083 is_bit_set!(is_index_modified, Status::INDEX_MODIFIED);
1084 is_bit_set!(is_index_deleted, Status::INDEX_DELETED);
1085 is_bit_set!(is_index_renamed, Status::INDEX_RENAMED);
1086 is_bit_set!(is_index_typechange, Status::INDEX_TYPECHANGE);
1087 is_bit_set!(is_wt_new, Status::WT_NEW);
1088 is_bit_set!(is_wt_modified, Status::WT_MODIFIED);
1089 is_bit_set!(is_wt_deleted, Status::WT_DELETED);
1090 is_bit_set!(is_wt_typechange, Status::WT_TYPECHANGE);
1091 is_bit_set!(is_wt_renamed, Status::WT_RENAMED);
1092 is_bit_set!(is_ignored, Status::IGNORED);
1093 is_bit_set!(is_conflicted, Status::CONFLICTED);
1094}
1095
1096bitflags! {
1097 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1099 pub struct RepositoryInitMode: u32 {
1100 const SHARED_UMASK = raw::GIT_REPOSITORY_INIT_SHARED_UMASK as u32;
1102 const SHARED_GROUP = raw::GIT_REPOSITORY_INIT_SHARED_GROUP as u32;
1105 const SHARED_ALL = raw::GIT_REPOSITORY_INIT_SHARED_ALL as u32;
1107 }
1108}
1109
1110impl RepositoryInitMode {
1111 is_bit_set!(is_shared_umask, RepositoryInitMode::SHARED_UMASK);
1112 is_bit_set!(is_shared_group, RepositoryInitMode::SHARED_GROUP);
1113 is_bit_set!(is_shared_all, RepositoryInitMode::SHARED_ALL);
1114}
1115
1116#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1118pub enum Delta {
1119 Unmodified,
1121 Added,
1123 Deleted,
1125 Modified,
1127 Renamed,
1129 Copied,
1131 Ignored,
1133 Untracked,
1135 Typechange,
1137 Unreadable,
1139 Conflicted,
1141}
1142
1143#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1145pub enum FileMode {
1146 Unreadable,
1148 Tree,
1150 Blob,
1152 BlobGroupWritable,
1154 BlobExecutable,
1156 Link,
1158 Commit,
1160}
1161
1162impl From<FileMode> for i32 {
1163 fn from(mode: FileMode) -> i32 {
1164 match mode {
1165 FileMode::Unreadable => raw::GIT_FILEMODE_UNREADABLE as i32,
1166 FileMode::Tree => raw::GIT_FILEMODE_TREE as i32,
1167 FileMode::Blob => raw::GIT_FILEMODE_BLOB as i32,
1168 FileMode::BlobGroupWritable => raw::GIT_FILEMODE_BLOB_GROUP_WRITABLE as i32,
1169 FileMode::BlobExecutable => raw::GIT_FILEMODE_BLOB_EXECUTABLE as i32,
1170 FileMode::Link => raw::GIT_FILEMODE_LINK as i32,
1171 FileMode::Commit => raw::GIT_FILEMODE_COMMIT as i32,
1172 }
1173 }
1174}
1175
1176impl From<FileMode> for u32 {
1177 fn from(mode: FileMode) -> u32 {
1178 match mode {
1179 FileMode::Unreadable => raw::GIT_FILEMODE_UNREADABLE as u32,
1180 FileMode::Tree => raw::GIT_FILEMODE_TREE as u32,
1181 FileMode::Blob => raw::GIT_FILEMODE_BLOB as u32,
1182 FileMode::BlobGroupWritable => raw::GIT_FILEMODE_BLOB_GROUP_WRITABLE as u32,
1183 FileMode::BlobExecutable => raw::GIT_FILEMODE_BLOB_EXECUTABLE as u32,
1184 FileMode::Link => raw::GIT_FILEMODE_LINK as u32,
1185 FileMode::Commit => raw::GIT_FILEMODE_COMMIT as u32,
1186 }
1187 }
1188}
1189
1190bitflags! {
1191 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1232 pub struct SubmoduleStatus: u32 {
1233 #[allow(missing_docs)]
1234 const IN_HEAD = raw::GIT_SUBMODULE_STATUS_IN_HEAD as u32;
1235 #[allow(missing_docs)]
1236 const IN_INDEX = raw::GIT_SUBMODULE_STATUS_IN_INDEX as u32;
1237 #[allow(missing_docs)]
1238 const IN_CONFIG = raw::GIT_SUBMODULE_STATUS_IN_CONFIG as u32;
1239 #[allow(missing_docs)]
1240 const IN_WD = raw::GIT_SUBMODULE_STATUS_IN_WD as u32;
1241 #[allow(missing_docs)]
1242 const INDEX_ADDED = raw::GIT_SUBMODULE_STATUS_INDEX_ADDED as u32;
1243 #[allow(missing_docs)]
1244 const INDEX_DELETED = raw::GIT_SUBMODULE_STATUS_INDEX_DELETED as u32;
1245 #[allow(missing_docs)]
1246 const INDEX_MODIFIED = raw::GIT_SUBMODULE_STATUS_INDEX_MODIFIED as u32;
1247 #[allow(missing_docs)]
1248 const WD_UNINITIALIZED =
1249 raw::GIT_SUBMODULE_STATUS_WD_UNINITIALIZED as u32;
1250 #[allow(missing_docs)]
1251 const WD_ADDED = raw::GIT_SUBMODULE_STATUS_WD_ADDED as u32;
1252 #[allow(missing_docs)]
1253 const WD_DELETED = raw::GIT_SUBMODULE_STATUS_WD_DELETED as u32;
1254 #[allow(missing_docs)]
1255 const WD_MODIFIED = raw::GIT_SUBMODULE_STATUS_WD_MODIFIED as u32;
1256 #[allow(missing_docs)]
1257 const WD_INDEX_MODIFIED =
1258 raw::GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED as u32;
1259 #[allow(missing_docs)]
1260 const WD_WD_MODIFIED = raw::GIT_SUBMODULE_STATUS_WD_WD_MODIFIED as u32;
1261 #[allow(missing_docs)]
1262 const WD_UNTRACKED = raw::GIT_SUBMODULE_STATUS_WD_UNTRACKED as u32;
1263 }
1264}
1265
1266impl SubmoduleStatus {
1267 is_bit_set!(is_in_head, SubmoduleStatus::IN_HEAD);
1268 is_bit_set!(is_in_index, SubmoduleStatus::IN_INDEX);
1269 is_bit_set!(is_in_config, SubmoduleStatus::IN_CONFIG);
1270 is_bit_set!(is_in_wd, SubmoduleStatus::IN_WD);
1271 is_bit_set!(is_index_added, SubmoduleStatus::INDEX_ADDED);
1272 is_bit_set!(is_index_deleted, SubmoduleStatus::INDEX_DELETED);
1273 is_bit_set!(is_index_modified, SubmoduleStatus::INDEX_MODIFIED);
1274 is_bit_set!(is_wd_uninitialized, SubmoduleStatus::WD_UNINITIALIZED);
1275 is_bit_set!(is_wd_added, SubmoduleStatus::WD_ADDED);
1276 is_bit_set!(is_wd_deleted, SubmoduleStatus::WD_DELETED);
1277 is_bit_set!(is_wd_modified, SubmoduleStatus::WD_MODIFIED);
1278 is_bit_set!(is_wd_wd_modified, SubmoduleStatus::WD_WD_MODIFIED);
1279 is_bit_set!(is_wd_untracked, SubmoduleStatus::WD_UNTRACKED);
1280}
1281
1282#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1288pub enum SubmoduleIgnore {
1289 Unspecified,
1291 None,
1293 Untracked,
1295 Dirty,
1297 All,
1299}
1300
1301#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1308pub enum SubmoduleUpdate {
1309 Checkout,
1312 Rebase,
1315 Merge,
1318 None,
1321 Default,
1324}
1325
1326bitflags! {
1327 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1329 pub struct PathspecFlags: u32 {
1330 const DEFAULT = raw::GIT_PATHSPEC_DEFAULT as u32;
1332 const IGNORE_CASE = raw::GIT_PATHSPEC_IGNORE_CASE as u32;
1335 const USE_CASE = raw::GIT_PATHSPEC_USE_CASE as u32;
1338 const NO_GLOB = raw::GIT_PATHSPEC_NO_GLOB as u32;
1341 const NO_MATCH_ERROR = raw::GIT_PATHSPEC_NO_MATCH_ERROR as u32;
1344 const FIND_FAILURES = raw::GIT_PATHSPEC_FIND_FAILURES as u32;
1348 const FAILURES_ONLY = raw::GIT_PATHSPEC_FAILURES_ONLY as u32;
1353 }
1354}
1355
1356impl PathspecFlags {
1357 is_bit_set!(is_default, PathspecFlags::DEFAULT);
1358 is_bit_set!(is_ignore_case, PathspecFlags::IGNORE_CASE);
1359 is_bit_set!(is_use_case, PathspecFlags::USE_CASE);
1360 is_bit_set!(is_no_glob, PathspecFlags::NO_GLOB);
1361 is_bit_set!(is_no_match_error, PathspecFlags::NO_MATCH_ERROR);
1362 is_bit_set!(is_find_failures, PathspecFlags::FIND_FAILURES);
1363 is_bit_set!(is_failures_only, PathspecFlags::FAILURES_ONLY);
1364}
1365
1366impl Default for PathspecFlags {
1367 fn default() -> Self {
1368 PathspecFlags::DEFAULT
1369 }
1370}
1371
1372bitflags! {
1373 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1375 pub struct CheckoutNotificationType: u32 {
1376 const CONFLICT = raw::GIT_CHECKOUT_NOTIFY_CONFLICT as u32;
1378 const DIRTY = raw::GIT_CHECKOUT_NOTIFY_DIRTY as u32;
1380 const UPDATED = raw::GIT_CHECKOUT_NOTIFY_UPDATED as u32;
1382 const UNTRACKED = raw::GIT_CHECKOUT_NOTIFY_UNTRACKED as u32;
1384 const IGNORED = raw::GIT_CHECKOUT_NOTIFY_IGNORED as u32;
1386 }
1387}
1388
1389impl CheckoutNotificationType {
1390 is_bit_set!(is_conflict, CheckoutNotificationType::CONFLICT);
1391 is_bit_set!(is_dirty, CheckoutNotificationType::DIRTY);
1392 is_bit_set!(is_updated, CheckoutNotificationType::UPDATED);
1393 is_bit_set!(is_untracked, CheckoutNotificationType::UNTRACKED);
1394 is_bit_set!(is_ignored, CheckoutNotificationType::IGNORED);
1395}
1396
1397#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1399pub enum DiffFormat {
1400 Patch,
1402 PatchHeader,
1404 Raw,
1406 NameOnly,
1408 NameStatus,
1410 PatchId,
1412}
1413
1414bitflags! {
1415 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1417 pub struct DiffStatsFormat: raw::git_diff_stats_format_t {
1418 const NONE = raw::GIT_DIFF_STATS_NONE;
1420 const FULL = raw::GIT_DIFF_STATS_FULL;
1422 const SHORT = raw::GIT_DIFF_STATS_SHORT;
1424 const NUMBER = raw::GIT_DIFF_STATS_NUMBER;
1426 const INCLUDE_SUMMARY = raw::GIT_DIFF_STATS_INCLUDE_SUMMARY;
1429 }
1430}
1431
1432impl DiffStatsFormat {
1433 is_bit_set!(is_none, DiffStatsFormat::NONE);
1434 is_bit_set!(is_full, DiffStatsFormat::FULL);
1435 is_bit_set!(is_short, DiffStatsFormat::SHORT);
1436 is_bit_set!(is_number, DiffStatsFormat::NUMBER);
1437 is_bit_set!(is_include_summary, DiffStatsFormat::INCLUDE_SUMMARY);
1438}
1439
1440#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1442pub enum AutotagOption {
1443 Unspecified,
1445 Auto,
1447 None,
1449 All,
1451}
1452
1453#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1455pub enum FetchPrune {
1456 Unspecified,
1458 On,
1460 Off,
1462}
1463
1464#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1468pub enum StashApplyProgress {
1469 None,
1471 LoadingStash,
1473 AnalyzeIndex,
1475 AnalyzeModified,
1477 AnalyzeUntracked,
1479 CheckoutUntracked,
1481 CheckoutModified,
1483 Done,
1485}
1486
1487bitflags! {
1488 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1490 pub struct StashApplyFlags: u32 {
1491 const DEFAULT = raw::GIT_STASH_APPLY_DEFAULT as u32;
1493 const REINSTATE_INDEX = raw::GIT_STASH_APPLY_REINSTATE_INDEX as u32;
1496 }
1497}
1498
1499impl StashApplyFlags {
1500 is_bit_set!(is_default, StashApplyFlags::DEFAULT);
1501 is_bit_set!(is_reinstate_index, StashApplyFlags::REINSTATE_INDEX);
1502}
1503
1504impl Default for StashApplyFlags {
1505 fn default() -> Self {
1506 StashApplyFlags::DEFAULT
1507 }
1508}
1509
1510bitflags! {
1511 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1516 pub struct StashFlags: u32 {
1517 const DEFAULT = raw::GIT_STASH_DEFAULT as u32;
1519 const KEEP_INDEX = raw::GIT_STASH_KEEP_INDEX as u32;
1522 const INCLUDE_UNTRACKED = raw::GIT_STASH_INCLUDE_UNTRACKED as u32;
1525 const INCLUDE_IGNORED = raw::GIT_STASH_INCLUDE_IGNORED as u32;
1528 const KEEP_ALL = raw::GIT_STASH_KEEP_ALL as u32;
1530 }
1531}
1532
1533impl StashFlags {
1534 is_bit_set!(is_default, StashFlags::DEFAULT);
1535 is_bit_set!(is_keep_index, StashFlags::KEEP_INDEX);
1536 is_bit_set!(is_include_untracked, StashFlags::INCLUDE_UNTRACKED);
1537 is_bit_set!(is_include_ignored, StashFlags::INCLUDE_IGNORED);
1538}
1539
1540impl Default for StashFlags {
1541 fn default() -> Self {
1542 StashFlags::DEFAULT
1543 }
1544}
1545
1546bitflags! {
1547 #[allow(missing_docs)]
1548 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1549 pub struct AttrCheckFlags: u32 {
1550 const FILE_THEN_INDEX = raw::GIT_ATTR_CHECK_FILE_THEN_INDEX as u32;
1552 const INDEX_THEN_FILE = raw::GIT_ATTR_CHECK_INDEX_THEN_FILE as u32;
1554 const INDEX_ONLY = raw::GIT_ATTR_CHECK_INDEX_ONLY as u32;
1556 const NO_SYSTEM = raw::GIT_ATTR_CHECK_NO_SYSTEM as u32;
1558 }
1559}
1560
1561impl Default for AttrCheckFlags {
1562 fn default() -> Self {
1563 AttrCheckFlags::FILE_THEN_INDEX
1564 }
1565}
1566
1567bitflags! {
1568 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1570 pub struct DiffFlags: u32 {
1571 const BINARY = raw::GIT_DIFF_FLAG_BINARY as u32;
1573 const NOT_BINARY = raw::GIT_DIFF_FLAG_NOT_BINARY as u32;
1575 const VALID_ID = raw::GIT_DIFF_FLAG_VALID_ID as u32;
1577 const EXISTS = raw::GIT_DIFF_FLAG_EXISTS as u32;
1579 }
1580}
1581
1582impl DiffFlags {
1583 is_bit_set!(is_binary, DiffFlags::BINARY);
1584 is_bit_set!(is_not_binary, DiffFlags::NOT_BINARY);
1585 is_bit_set!(has_valid_id, DiffFlags::VALID_ID);
1586 is_bit_set!(exists, DiffFlags::EXISTS);
1587}
1588
1589bitflags! {
1590 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
1592 pub struct ReferenceFormat: u32 {
1593 const NORMAL = raw::GIT_REFERENCE_FORMAT_NORMAL as u32;
1595 const ALLOW_ONELEVEL = raw::GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL as u32;
1600 const REFSPEC_PATTERN = raw::GIT_REFERENCE_FORMAT_REFSPEC_PATTERN as u32;
1605 const REFSPEC_SHORTHAND = raw::GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND as u32;
1609 }
1610}
1611
1612impl ReferenceFormat {
1613 is_bit_set!(is_allow_onelevel, ReferenceFormat::ALLOW_ONELEVEL);
1614 is_bit_set!(is_refspec_pattern, ReferenceFormat::REFSPEC_PATTERN);
1615 is_bit_set!(is_refspec_shorthand, ReferenceFormat::REFSPEC_SHORTHAND);
1616}
1617
1618impl Default for ReferenceFormat {
1619 fn default() -> Self {
1620 ReferenceFormat::NORMAL
1621 }
1622}
1623
1624#[cfg(test)]
1625mod tests {
1626 use super::{FileMode, ObjectType};
1627
1628 #[test]
1629 fn convert() {
1630 assert_eq!(ObjectType::Blob.str(), "blob");
1631 assert_eq!(ObjectType::from_str("blob"), Some(ObjectType::Blob));
1632 assert!(ObjectType::Blob.is_loose());
1633 }
1634
1635 #[test]
1636 fn convert_filemode() {
1637 assert_eq!(i32::from(FileMode::Blob), 0o100644);
1638 assert_eq!(i32::from(FileMode::BlobGroupWritable), 0o100664);
1639 assert_eq!(i32::from(FileMode::BlobExecutable), 0o100755);
1640 assert_eq!(u32::from(FileMode::Blob), 0o100644);
1641 assert_eq!(u32::from(FileMode::BlobGroupWritable), 0o100664);
1642 assert_eq!(u32::from(FileMode::BlobExecutable), 0o100755);
1643 }
1644
1645 #[test]
1646 fn bitflags_partial_eq() {
1647 use super::{
1648 AttrCheckFlags, CheckoutNotificationType, CredentialType, DiffFlags, DiffStatsFormat,
1649 IndexAddOption, IndexEntryExtendedFlag, IndexEntryFlag, MergeAnalysis, MergePreference,
1650 OdbLookupFlags, PathspecFlags, ReferenceFormat, RepositoryInitMode,
1651 RepositoryOpenFlags, RevparseMode, Sort, StashApplyFlags, StashFlags, Status,
1652 SubmoduleStatus,
1653 };
1654
1655 assert_eq!(
1656 AttrCheckFlags::FILE_THEN_INDEX,
1657 AttrCheckFlags::FILE_THEN_INDEX
1658 );
1659 assert_eq!(
1660 CheckoutNotificationType::CONFLICT,
1661 CheckoutNotificationType::CONFLICT
1662 );
1663 assert_eq!(
1664 CredentialType::USER_PASS_PLAINTEXT,
1665 CredentialType::USER_PASS_PLAINTEXT
1666 );
1667 assert_eq!(DiffFlags::BINARY, DiffFlags::BINARY);
1668 assert_eq!(
1669 DiffStatsFormat::INCLUDE_SUMMARY,
1670 DiffStatsFormat::INCLUDE_SUMMARY
1671 );
1672 assert_eq!(
1673 IndexAddOption::CHECK_PATHSPEC,
1674 IndexAddOption::CHECK_PATHSPEC
1675 );
1676 assert_eq!(
1677 IndexEntryExtendedFlag::INTENT_TO_ADD,
1678 IndexEntryExtendedFlag::INTENT_TO_ADD
1679 );
1680 assert_eq!(IndexEntryFlag::EXTENDED, IndexEntryFlag::EXTENDED);
1681 assert_eq!(
1682 MergeAnalysis::ANALYSIS_FASTFORWARD,
1683 MergeAnalysis::ANALYSIS_FASTFORWARD
1684 );
1685 assert_eq!(
1686 MergePreference::FASTFORWARD_ONLY,
1687 MergePreference::FASTFORWARD_ONLY
1688 );
1689 assert_eq!(OdbLookupFlags::NO_REFRESH, OdbLookupFlags::NO_REFRESH);
1690 assert_eq!(PathspecFlags::FAILURES_ONLY, PathspecFlags::FAILURES_ONLY);
1691 assert_eq!(
1692 ReferenceFormat::ALLOW_ONELEVEL,
1693 ReferenceFormat::ALLOW_ONELEVEL
1694 );
1695 assert_eq!(
1696 RepositoryInitMode::SHARED_ALL,
1697 RepositoryInitMode::SHARED_ALL
1698 );
1699 assert_eq!(RepositoryOpenFlags::CROSS_FS, RepositoryOpenFlags::CROSS_FS);
1700 assert_eq!(RevparseMode::RANGE, RevparseMode::RANGE);
1701 assert_eq!(Sort::REVERSE, Sort::REVERSE);
1702 assert_eq!(
1703 StashApplyFlags::REINSTATE_INDEX,
1704 StashApplyFlags::REINSTATE_INDEX
1705 );
1706 assert_eq!(StashFlags::INCLUDE_IGNORED, StashFlags::INCLUDE_IGNORED);
1707 assert_eq!(Status::WT_MODIFIED, Status::WT_MODIFIED);
1708 assert_eq!(SubmoduleStatus::WD_ADDED, SubmoduleStatus::WD_ADDED);
1709 }
1710}