#![feature(macro_rules, unsafe_destructor)]
#![deny(missing_docs)]
extern crate libc;
extern crate time;
extern crate url;
extern crate "libgit2-sys" as raw;
use std::c_str::CString;
use std::fmt;
use std::mem;
use std::rt;
use std::str;
use std::sync::{Once, ONCE_INIT};
pub use blob::Blob;
pub use branch::{Branch, Branches};
pub use buf::Buf;
pub use commit::{Commit, Parents};
pub use config::{Config, ConfigEntry, ConfigEntries};
pub use cred::{Cred, CredentialHelper};
pub use error::Error;
pub use index::{Index, IndexEntry, IndexEntries, IndexMatchedPath};
pub use object::Object;
pub use oid::Oid;
pub use push::{Push, Status};
pub use reference::{Reference, References, ReferenceNames};
pub use refspec::Refspec;
pub use remote::{Remote, Refspecs};
pub use remote_callbacks::{RemoteCallbacks, Credentials, TransferProgress};
pub use remote_callbacks::{TransportMessage, Progress};
pub use repo::{Repository, RepositoryInitOptions};
pub use revspec::Revspec;
pub use signature::Signature;
pub use string_array::{StringArray, StringArrayItems, StringArrayBytes};
pub use submodule::Submodule;
pub use tag::Tag;
pub use tree::{Tree, TreeEntry};
#[deriving(PartialEq, Eq, Clone, Show, Copy)]
pub enum ErrorCode {
GenericError,
NotFound,
Exists,
Ambiguous,
BufSize,
User,
BareRepo,
UnbornBranch,
Unmerged,
NotFastForward,
InvalidSpec,
MergeConflict,
Locked,
Modified,
}
#[deriving(PartialEq, Eq, Clone, Show, Copy)]
#[allow(missing_docs)]
pub enum RepositoryState {
Clean,
Merge,
Revert,
CherryPick,
Bisect,
Rebase,
RebaseInteractive,
RebaseMerge,
ApplyMailbox,
ApplyMailboxOrRebase,
}
#[deriving(Copy)]
pub enum Direction {
Fetch,
Push,
}
#[deriving(Copy)]
pub enum ResetType {
Soft,
Mixed,
Hard,
}
#[deriving(PartialEq, Eq, Copy)]
pub enum ObjectType {
Any,
Commit,
Tree,
Blob,
Tag,
}
#[deriving(PartialEq, Eq, Show, Copy)]
pub enum BranchType {
Local,
Remote,
}
#[deriving(PartialEq, Eq, Show, Copy)]
pub enum ConfigLevel {
System,
XDG,
Global,
Local,
App,
Highest,
}
bitflags! {
#[doc = "
Types of credentials that can be requested by a credential callback.
"]
flags CredentialType: uint {
const USER_PASS_PLAINTEXT = raw::GIT_CREDTYPE_USERPASS_PLAINTEXT as uint,
const SSH_KEY = raw::GIT_CREDTYPE_SSH_KEY as uint,
const SSH_CUSTOM = raw::GIT_CREDTYPE_SSH_CUSTOM as uint,
const DEFAULT = raw::GIT_CREDTYPE_DEFAULT as uint,
const SSH_INTERACTIVE = raw::GIT_CREDTYPE_SSH_INTERACTIVE as uint,
}
}
bitflags! {
#[doc = "
Flags for APIs that add files matching pathspec
"]
flags IndexAddOption: u32 {
const ADD_DEFAULT = raw::GIT_INDEX_ADD_DEFAULT as u32,
const ADD_FORCE = raw::GIT_INDEX_ADD_FORCE as u32,
const ADD_DISABLE_PATHSPEC_MATCH =
raw::GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH as u32,
const ADD_CHECK_PATHSPEC = raw::GIT_INDEX_ADD_CHECK_PATHSPEC as u32,
}
}
mod call;
pub mod build;
mod blob;
mod branch;
mod buf;
mod commit;
mod config;
mod cred;
mod error;
mod index;
mod object;
mod oid;
mod push;
mod reference;
mod refspec;
mod remote;
mod remote_callbacks;
mod repo;
mod revspec;
mod signature;
mod string_array;
mod submodule;
mod tag;
mod tree;
#[cfg(test)] mod test;
fn init() {
static INIT: Once = ONCE_INIT;
INIT.doit(|| unsafe {
raw::openssl_init();
let r = raw::git_libgit2_init();
assert!(r >= 0,
"couldn't initialize the libgit2 library: {}", r);
rt::at_exit(|| {
raw::git_libgit2_shutdown();
});
});
}
unsafe fn opt_bytes<'a, T>(_: &'a T,
c: *const libc::c_char) -> Option<&'a [u8]> {
if c.is_null() {
None
} else {
let s = CString::new(c, false);
Some(mem::transmute(s.as_bytes_no_nul()))
}
}
impl ObjectType {
pub fn str(&self) -> &'static str {
unsafe {
let ptr = call!(raw::git_object_type2string(*self));
mem::transmute::<&str, &'static str>(str::from_c_str(ptr))
}
}
pub fn is_loose(&self) -> bool {
unsafe { (call!(raw::git_object_typeisloose(*self)) == 1) }
}
pub fn from_raw(raw: raw::git_otype) -> Option<ObjectType> {
match raw {
raw::GIT_OBJ_ANY => Some(ObjectType::Any),
raw::GIT_OBJ_BAD => None,
raw::GIT_OBJ__EXT1 => None,
raw::GIT_OBJ_COMMIT => Some(ObjectType::Commit),
raw::GIT_OBJ_TREE => Some(ObjectType::Tree),
raw::GIT_OBJ_BLOB => Some(ObjectType::Blob),
raw::GIT_OBJ_TAG => Some(ObjectType::Tag),
raw::GIT_OBJ__EXT2 => None,
raw::GIT_OBJ_OFS_DELTA => None,
raw::GIT_OBJ_REF_DELTA => None,
}
}
pub fn raw(&self) -> raw::git_otype {
call::convert(self)
}
pub fn from_str(s: &str) -> Option<ObjectType> {
let raw = unsafe { call!(raw::git_object_string2type(s.to_c_str())) };
ObjectType::from_raw(raw)
}
}
impl fmt::Show for ObjectType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.str().fmt(f)
}
}
impl ConfigLevel {
pub fn from_raw(raw: raw::git_config_level_t) -> ConfigLevel {
match raw {
raw::GIT_CONFIG_LEVEL_SYSTEM => ConfigLevel::System,
raw::GIT_CONFIG_LEVEL_XDG => ConfigLevel::XDG,
raw::GIT_CONFIG_LEVEL_GLOBAL => ConfigLevel::Global,
raw::GIT_CONFIG_LEVEL_LOCAL => ConfigLevel::Local,
raw::GIT_CONFIG_LEVEL_APP => ConfigLevel::App,
raw::GIT_CONFIG_HIGHEST_LEVEL => ConfigLevel::Highest,
}
}
}
#[cfg(test)]
mod tests {
use super::ObjectType;
#[test]
fn convert() {
assert_eq!(ObjectType::Blob.str(), "blob");
assert_eq!(ObjectType::from_str("blob"), Some(ObjectType::Blob));
assert!(ObjectType::Blob.is_loose());
}
}