🍯 Glaze

package git2_bindings

import "core:c"

Error :: struct {
	message: cstring,
	klass:   Klass,
}

Klass :: enum c.int {
	None       = 0,
	Nomemory   = 1,
	Os         = 2,
	Invalid    = 3,
	Reference  = 4,
	Zlib       = 5,
	Repository = 6,
	Config     = 7,
	Regex      = 8,
	Odb        = 9,
	Index      = 10,
	Object     = 11,
	Net        = 12,
	Tag        = 13,
	Tree       = 14,
	Indexer    = 15,
	Ssl        = 16,
	Submodule  = 17,
	Thread     = 18,
	Stash      = 19,
	Checkout   = 20,
	Fetchhead  = 21,
	Merge      = 22,
	Ssh        = 23,
	Filter     = 24,
	Revert     = 25,
	Callback   = 26,
	Cherrypick = 27,
	Describe   = 28,
	Rebase     = 29,
	Filesystem = 30,
	Patch      = 31,
	Worktree   = 32,
	Sha        = 33,
	Http       = 34,
	Internal   = 35,
	Grafts     = 36,
}

Result :: enum c.int {
	Ok              = 0,
	Error           = -1,
	Enotfound       = -3,
	Eexists         = -4,
	Eambiguous      = -5,
	Ebufs           = -6,
	Euser           = -7,
	Ebarerepo       = -8,
	Eunbornbranch   = -9,
	Eunmerged       = -10,
	Enonfastforward = -11,
	Einvalidspec    = -12,
	Econflict       = -13,
	Elocked         = -14,
	Emodified       = -15,
	Eauth           = -16,
	Ecertificate    = -17,
	Eapplied        = -18,
	Epeel           = -19,
	Eeof            = -20,
	Einvalid        = -21,
	Euncommitted    = -22,
	Edirectory      = -23,
	Emergeconflict  = -24,
	Passthrough     = -30,
	Iterover        = -31,
	Retry           = -32,
	Emismatch       = -33,
	Eindexdirty     = -34,
	Eapplyfail      = -35,
	Eowner          = -36,
	Timeout         = -37,
	Eunchanged      = -38,
	Enotsupported   = -39,
	Ereadonly       = -40,
}

Repository :: distinct rawptr
Reference :: distinct rawptr
Reference_Iterator :: distinct rawptr
Blob :: distinct rawptr
Tree_Entry :: distinct rawptr
Tree_Builder :: distinct rawptr
Config :: distinct rawptr
Config_Iterator :: distinct rawptr
Index :: distinct rawptr
Index_Iterator :: distinct rawptr
Index_Conflict_Iterator :: distinct rawptr
Revwalk :: distinct rawptr
Remote :: distinct rawptr
Reflog :: distinct rawptr
Reflog_Entry :: distinct rawptr
Branch_Iterator :: distinct rawptr
Annotated_Commit :: distinct rawptr
Status_List :: distinct rawptr
Diff :: distinct rawptr
Diff_Stats :: distinct rawptr
Patch :: distinct rawptr
Blame :: distinct rawptr
Odb :: distinct rawptr
Odb_Object :: distinct rawptr
Note :: distinct rawptr
Note_Iterator :: distinct rawptr
Packbuilder :: distinct rawptr
Transaction :: distinct rawptr
Worktree :: distinct rawptr
Mailmap :: distinct rawptr
Submodule :: distinct rawptr
Rebase :: distinct rawptr
Oid_Shorten :: distinct rawptr

Object :: distinct rawptr
Commit :: Object
Tree :: Object
Tag :: Object

Oid :: struct {
	id: [20]u8,
}

Signature_Time :: struct {
	time:   Time,
	offset: c.int,
	sign:   u8,
}

Time :: c.int64_t

Signature :: struct {
	name:     cstring,
	email:    cstring,
	sig_when: Signature_Time,
}

Object_Type :: enum c.int {
	Any       = -2,
	Invalid   = -1,
	Commit    = 1,
	Tree      = 2,
	Blob      = 3,
	Tag       = 4,
	Ofs_Delta = 6,
	Ref_Delta = 7,
}

Reference_Type :: enum c.int {
	Invalid  = 0,
	Direct   = 1,
	Symbolic = 2,
	All      = 3,
}

Branch_Type :: enum c.int {
	Local  = 1,
	Remote = 2,
	All    = 3,
}

Filemode :: enum c.int {
	Unreadable      = 0o000000,
	Tree            = 0o040000,
	Blob            = 0o100644,
	Blob_Executable = 0o100755,
	Link            = 0o120000,
	Commit          = 0o160000,
}

Buf :: struct {
	ptr:      [^]u8,
	reserved: c.size_t,
	size:     c.size_t,
}

Strarray :: struct {
	strings: [^]cstring,
	count:   c.size_t,
}

Oidarray :: struct {
	ids:   [^]Oid,
	count: c.size_t,
}

Index_Time :: struct {
	seconds:     c.int32_t,
	nanoseconds: c.uint32_t,
}

Index_Entry :: struct {
	ctime:          Index_Time,
	mtime:          Index_Time,
	dev:            c.uint32_t,
	ino:            c.uint32_t,
	mode:           c.uint32_t,
	uid:            c.uint32_t,
	gid:            c.uint32_t,
	file_size:      c.uint32_t,
	id:             Oid,
	flags:          c.uint16_t,
	flags_extended: c.uint16_t,
	path:           cstring,
}

// --- Diff types ---

Delta_Type :: enum c.int {
	Unmodified = 0,
	Added      = 1,
	Deleted    = 2,
	Modified   = 3,
	Renamed    = 4,
	Copied     = 5,
	Ignored    = 6,
	Untracked  = 7,
	Typechange = 8,
	Unreadable = 9,
	Conflicted = 10,
}

Diff_Flag :: enum c.uint32_t {
	Binary     = 0,
	Not_Binary = 1,
	Valid_Id   = 2,
	Exists     = 3,
	Valid_Size = 4,
}
Diff_Flags :: distinct bit_set[Diff_Flag;c.uint32_t]

Diff_File :: struct {
	id:        Oid,
	path:      cstring,
	size:      c.uint64_t,
	flags:     c.uint32_t,
	mode:      c.uint16_t,
	id_abbrev: c.uint16_t,
}

Diff_Delta :: struct {
	status:     Delta_Type,
	flags:      c.uint32_t,
	similarity: c.uint16_t,
	nfiles:     c.uint16_t,
	old_file:   Diff_File,
	new_file:   Diff_File,
}

Diff_Hunk :: struct {
	old_start:  c.int,
	old_lines:  c.int,
	new_start:  c.int,
	new_lines:  c.int,
	header_len: c.size_t,
	header:     [128]u8,
}

Diff_Line :: struct {
	origin:         u8,
	old_lineno:     c.int,
	new_lineno:     c.int,
	num_lines:      c.int,
	content_len:    c.size_t,
	content_offset: c.int64_t,
	content:        [^]u8,
}

Diff_Format :: enum c.int {
	Patch        = 1,
	Patch_Header = 2,
	Raw          = 3,
	Name_Only    = 4,
	Name_Status  = 5,
	Patch_Id     = 6,
}

Diff_Stats_Format :: enum c.uint {
	None            = 0,
	Full            = 1,
	Short           = 2,
	Number          = 4,
	Include_Summary = 8,
}

Status_Flags :: distinct c.uint

STATUS_CURRENT: Status_Flags : 0
STATUS_INDEX_NEW: Status_Flags : (1 << 0)
STATUS_INDEX_MODIFIED: Status_Flags : (1 << 1)
STATUS_INDEX_DELETED: Status_Flags : (1 << 2)
STATUS_INDEX_RENAMED: Status_Flags : (1 << 3)
STATUS_INDEX_TYPECHANGE: Status_Flags : (1 << 4)
STATUS_WT_NEW: Status_Flags : (1 << 7)
STATUS_WT_MODIFIED: Status_Flags : (1 << 8)
STATUS_WT_DELETED: Status_Flags : (1 << 9)
STATUS_WT_TYPECHANGE: Status_Flags : (1 << 10)
STATUS_WT_RENAMED: Status_Flags : (1 << 11)
STATUS_WT_UNREADABLE: Status_Flags : (1 << 12)
STATUS_IGNORED: Status_Flags : (1 << 14)
STATUS_CONFLICTED: Status_Flags : (1 << 15)

Status_Show :: enum c.int {
	Index_And_Workdir = 0,
	Index_Only        = 1,
	Workdir_Only      = 2,
}

Status_Options :: struct {
	version:          c.uint,
	show:             Status_Show,
	flags:            c.uint,
	pathspec:         Strarray,
	baseline:         Tree,
	rename_threshold: c.uint16_t,
}

Status_Entry :: struct {
	status:           Status_Flags,
	head_to_index:    ^Diff_Delta,
	index_to_workdir: ^Diff_Delta,
}

Sort_Flags :: distinct c.uint

SORT_NONE: Sort_Flags : 0
SORT_TOPOLOGICAL: Sort_Flags : (1 << 0)
SORT_TIME: Sort_Flags : (1 << 1)
SORT_REVERSE: Sort_Flags : (1 << 2)

Checkout_Strategy :: distinct c.uint

CHECKOUT_NONE: Checkout_Strategy : 0
CHECKOUT_SAFE: Checkout_Strategy : (1 << 0)
CHECKOUT_FORCE: Checkout_Strategy : (1 << 1)
CHECKOUT_RECREATE_MISSING: Checkout_Strategy : (1 << 2)
CHECKOUT_ALLOW_CONFLICTS: Checkout_Strategy : (1 << 3)
CHECKOUT_REMOVE_UNTRACKED: Checkout_Strategy : (1 << 4)
CHECKOUT_REMOVE_IGNORED: Checkout_Strategy : (1 << 5)
CHECKOUT_UPDATE_ONLY: Checkout_Strategy : (1 << 6)
CHECKOUT_DONT_UPDATE_INDEX: Checkout_Strategy : (1 << 7)
CHECKOUT_NO_REFRESH: Checkout_Strategy : (1 << 8)
CHECKOUT_SKIP_UNMERGED: Checkout_Strategy : (1 << 9)
CHECKOUT_USE_OURS: Checkout_Strategy : (1 << 10)
CHECKOUT_USE_THEIRS: Checkout_Strategy : (1 << 11)
CHECKOUT_DISABLE_PATHSPEC_MATCH: Checkout_Strategy : (1 << 12)
CHECKOUT_SKIP_LOCKED_DIRECTORIES: Checkout_Strategy : (1 << 18)
CHECKOUT_DONT_OVERWRITE_IGNORED: Checkout_Strategy : (1 << 19)
CHECKOUT_CONFLICT_STYLE_MERGE: Checkout_Strategy : (1 << 20)
CHECKOUT_CONFLICT_STYLE_DIFF3: Checkout_Strategy : (1 << 21)
CHECKOUT_DONT_REMOVE_EXISTING: Checkout_Strategy : (1 << 22)
CHECKOUT_DONT_WRITE_INDEX: Checkout_Strategy : (1 << 23)
CHECKOUT_DRY_RUN: Checkout_Strategy : (1 << 24)
CHECKOUT_CONFLICT_STYLE_ZDIFF3: Checkout_Strategy : (1 << 25)

Checkout_Options :: struct {
	version:           c.uint,
	checkout_strategy: Checkout_Strategy,
	disable_filters:   c.int,
	dir_mode:          c.uint,
	file_mode:         c.uint,
	file_open_flags:   c.int,
	notify_flags:      c.uint,
	notify_cb:         rawptr,
	notify_payload:    rawptr,
	progress_cb:       rawptr,
	progress_payload:  rawptr,
	paths:             Strarray,
	baseline:          Tree,
	baseline_index:    Index,
	target_directory:  cstring,
	ancestor_label:    cstring,
	our_label:         cstring,
	their_label:       cstring,
	perfdata_cb:       rawptr,
	perfdata_payload:  rawptr,
}

Merge_Analysis :: enum c.int {
	None        = 0,
	Normal      = 1,
	Up_To_Date  = 2,
	Fastforward = 4,
	Unborn      = 8,
}

Merge_Preference :: enum c.int {
	None             = 0,
	No_Fastforward   = 1,
	Fastforward_Only = 2,
}

Clone_Local :: enum c.int {
	Auto     = 0,
	Local    = 1,
	No_Local = 2,
	No_Links = 3,
}

Submodule_Update :: enum c.int {
	Checkout = 1,
	Rebase   = 2,
	Merge    = 3,
	None     = 4,
	Default  = 0,
}

Submodule_Ignore :: enum c.int {
	Unspecified = -1,
	None        = 1,
	Untracked   = 2,
	Dirty       = 3,
	All         = 4,
}

Submodule_Recurse :: enum c.int {
	No       = 0,
	Yes      = 1,
	Ondemand = 2,
}

Reset_Type :: enum c.int {
	Soft  = 1,
	Mixed = 2,
	Hard  = 3,
}

Stash_Flags :: distinct c.uint

STASH_DEFAULT: Stash_Flags : 0
STASH_KEEP_INDEX: Stash_Flags : (1 << 0)
STASH_INCLUDE_UNTRACKED: Stash_Flags : (1 << 1)
STASH_INCLUDE_IGNORED: Stash_Flags : (1 << 2)
STASH_KEEP_ALL: Stash_Flags : (1 << 3)

Blame_Hunk :: struct {
	lines_in_hunk:           c.size_t,
	final_commit_id:         Oid,
	final_start_line_number: c.size_t,
	final_signature:         ^Signature,
	final_committer:         ^Signature,
	orig_commit_id:          Oid,
	orig_path:               cstring,
	orig_start_line_number:  c.size_t,
	orig_signature:          ^Signature,
	orig_committer:          ^Signature,
	boundary:                u8,
}

Describe_Strategy :: enum c.uint {
	Default = 0,
	Tags    = 1,
	All     = 2,
}

Repository_State :: enum c.int {
	None                    = 0,
	Merge                   = 1,
	Revert                  = 2,
	Revert_Sequence         = 3,
	Cherrypick              = 4,
	Cherrypick_Sequence     = 5,
	Bisect                  = 6,
	Rebase                  = 7,
	Rebase_Interactive      = 8,
	Rebase_Merge            = 9,
	Apply_Mailbox           = 10,
	Apply_Mailbox_Or_Rebase = 11,
}

Reference_Foreach_Name_Cb :: #type proc "c" (name: cstring, payload: rawptr) -> c.int
Status_Cb :: #type proc "c" (path: cstring, status_flags: Status_Flags, payload: rawptr) -> c.int
Diff_File_Cb :: #type proc "c" (delta: ^Diff_Delta, progress: c.float, payload: rawptr) -> c.int
Diff_Binary_Cb :: #type proc "c" (delta: ^Diff_Delta, binary: rawptr, payload: rawptr) -> c.int
Diff_Hunk_Cb :: #type proc "c" (delta: ^Diff_Delta, hunk: ^Diff_Hunk, payload: rawptr) -> c.int
Diff_Line_Cb :: #type proc "c" (delta: ^Diff_Delta, hunk: ^Diff_Hunk, line: ^Diff_Line, payload: rawptr) -> c.int
Stash_Cb :: #type proc "c" (index: c.size_t, message: cstring, stash_id: ^Oid, payload: rawptr) -> c.int
Tag_Foreach_Cb :: #type proc "c" (name: cstring, oid: ^Oid, payload: rawptr) -> c.int
Fetchhead_Foreach_Cb :: #type proc "c" (
	ref_name: cstring,
	remote_url: cstring,
	oid: ^Oid,
	is_merge: c.uint,
	payload: rawptr,
) -> c.int
Mergehead_Foreach_Cb :: #type proc "c" (oid: ^Oid, payload: rawptr) -> c.int
Note_Foreach_Cb :: #type proc "c" (blob_id: ^Oid, annotated_object_id: ^Oid, payload: rawptr) -> c.int
Revwalk_Hide_Cb :: #type proc "c" (commit_id: ^Oid, payload: rawptr) -> c.int