Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit ugit2;
- (* Common configuration.
- This file is included by library units to configure the compiler. It isn't
- neccessary to include it in your projects. *)
- {TODO: Detect MacOS and iOS}
- {TODO: Detect Android?}
- {TODO: Detect GNU/Pascal?}
- (* Code to detect Delphi.
- Seems that old Delphi (i.e: Delphi6) defines DELPHI but newer ones
- doesn't (or at least Tokio 10.2 doesn't) so some tweaking should be done.
- Note that this code was tested with Delphi Tokio 10.2 Starter Edition only.
- I've tryed Delphi 6 proffesional and IT DOESN'T WORK AT ALL and I don't see
- how to make it run. Theoretically it should work with Delphi 7 (as I've
- tryed to keep Cieslak's changes) but I haven't a copy so it isn't tested.
- Also I've used a table from Embarcadero's Delphi Wiki.
- http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Conditional_compilation_(Delphi)
- *)
- {$IFNDEF DELPHI}
- {$IFDEF DCC}
- {$DEFINE DELPHI}
- {$ENDIF}
- {$ENDIF}
- {$IFNDEF FPC}
- {$IFNDEF DELPHI}
- {
- This version wasn't tested with other compilers than Free Pascal and Delphi.
- May be you want to help porting it to other systems and compilers, won't you?
- }
- {$ERROR ugit2.pas wasn't tested with this compiler. Do you want to help? }
- {$ENDIF}
- {$ENDIF}
- { Configure the compiler. }
- {$IFDEF FPC}
- { Free Pascal. }
- { Checks platform. }
- {$IFDEF UNIX}
- {$IF DEFINED(DARWIN) OR DEFINED(QNX) OR DEFINED(BEOS)}
- {
- This version wasn't tested on those systems.
- May be you want to help porting it to other systems and compilers, won't you?
- }
- {$ERROR ugit2.pas wasn't tested on your Operating System. Do you want to help? }
- {$ENDIF}
- {$ELSE}
- {$IFNDEF WINDOWS}
- {$ERROR ugit2.pas wasn't tested on your Operating System. Do you want to help? }
- {$ENDIF}
- {$ENDIF}
- { Sets dialect. }
- {$IF NOT DEFINED(FPC_DELPHI)}
- {$MODE DELPHI}
- {$ENDIF}
- {$MACRO ON}
- {$LONGSTRINGS ON}
- {$PACKRECORDS C}
- {$PACKENUM 4}
- {$IFNDEF DEBUGMODE}
- {$SMARTLINK ON}
- {$ELSE}
- {$INLINE OFF}
- {$ENDIF}
- {$ENDIF}
- {$IFDEF DELPHI}
- { Delphi }
- { Checks platform }
- {$IFDEF CONDITIONALEXPRESSIONS}
- {$IF CompilerVersion >= 18.5}
- {$DEFINE ISDELPHI2007ANDUP}
- {$ENDIF}
- {$IF CompilerVersion >= 20.0}
- {$DEFINE ISDELPHI2009ANDUP}
- {$ENDIF}
- {$ENDIF}
- { Delphi and Free Pascal have different ways to tell they're generating an
- executable for Windows. }
- {$IFNDEF WINDOWS}
- {$IFDEF MSWINDOWS}
- {$DEFINE WINDOWS}
- {$ENDIF}
- {$ENDIF}
- { CPU has some issues as well. }
- {$IFNDEF CPU64}
- {$IFDEF CPU64BITS}
- {$DEFINE CPU64}
- {$ENDIF}
- {$ENDIF}
- { Set compiler options. }
- {$LONGSTRINGS ON}
- {TODO: Next directive works on 32bit, it wasn''t tested on 64bit.}
- {$ALIGN 8}
- {$MINENUMSIZE 4}
- {$ENDIF}
- interface
- uses ctypes, MultiLog;
- (* Defines some constants to build the correct names of the library files. *)
- const
- {$IFDEF DEBUGMODE}
- _DBG_ = '-debug';{<@exclude }
- {$ELSE}
- _DBG_ = ''; {<@exclude }
- {$ENDIF}
- {$IF DEFINED(LINUX)}
- (* @exclude Prefix for libraries. *)
- _LG2_LIB_PREFIX_ = 'lib';
- (* @exclude Sufix/extension for libraries. *)
- _LG2_LIB_EXT_ = '.so';
- {$ELSEIF DEFINED(UNIX)}
- (* @exclude Prefix for libraries. *)
- _LG2_LIB_PREFIX_ = 'lib';
- (* @exclude Sufix/extension for libraries. *)
- _LG2_LIB_EXT_ = '.so';
- {$ELSEIF DEFINED(WINDOWS)}
- (* @exclude Prefix for libraries. *)
- _LG2_LIB_PREFIX_ = '';
- (* @exclude Sufix/extension for libraries. *)
- _LG2_LIB_EXT_ = '.dll';
- {$ENDIF}
- (* @exclude Builds main library name. AFAIK it's not needed. *)
- LIBGIT2_MAIN_LIB_NAME = _LG2_LIB_PREFIX_+'git2_main'+_DBG_+_LG2_LIB_EXT_;
- (* @exclude Builds library name. *)
- LIBGIT2_LIB_NAME = _LG2_LIB_PREFIX_+'git2'+_DBG_+_LG2_LIB_EXT_;
- type
- (* Generic pointer. *)
- LG2_POINTER = POINTER;
- (* Signed 8bit integer values. *)
- LG2_INT8 = SHORTINT;
- (* Unsigned 8bit integer values. *)
- LG2_UINT8 = BYTE;
- (* Signed 16bit integer values. *)
- LG2_INT16 = SMALLINT;
- (* Unsigned 16bit integer values. *)
- LG2_UINT16 = WORD;
- (* Signed 32bit integer values. *)
- LG2_INT32 = LONGINT;
- (* Unsigned 32bit integer values. *)
- LG2_UINT32 = LONGWORD;
- (* Signed 64bit integer values. *)
- LG2_INT64 = INT64;
- {$IFDEF FPC}
- (* Unsigned 64bit integer values. *)
- LG2_UINT64 = QWORD;
- {$ELSE}
- {$IFDEF ISDELPHI2007ANDUP}
- (* Unsigned 64bit integer values. *)
- LG2_UINT64 = UINT64;
- {$ELSE}
- (* Unsigned 64bit integer values. *)
- LG2_UINT64 = INT64;
- {$ENDIF}
- {$ENDIF}
- { TODO: Check wich boolean type does it uses. }
- (* Boolean result. *)
- LG2_BOOL = LONGBOOL;
- (* Signed 8bit integer.
- Note that it isn't Pascal's CHAR type! *)
- LG2_CHAR = LG2_INT8;
- (* Unsigned 8bit integer values. *)
- LG2_UCHAR = LG2_UINT8;
- (* Signed 16bit integer values. *)
- LG2_SHORT = LG2_INT16;
- (* Unsigned 16bit integer values. *)
- LG2_USHORT = LG2_UINT16;
- (* Signed 32bit integer values. *)
- LG2_INT = LG2_INT32;
- (* Unsigned 32bit integer values. *)
- LG2_UINT = LG2_UINT32;
- {$IFDEF CPU64}
- {$IFDEF WINDOWS}
- (* Signed 32/64bit integer values. *)
- LG2_LONG = LG2_INT32;
- (* Unsigned 32/64bit integer values. *)
- LG2_ULONG = LG2_UINT32;
- {$ELSE}
- (* Signed 32/64bit integer values. *)
- LG2_LONG = LG2_INT64;
- (* Unsigned 32/64bit integer values. *)
- LG2_ULONG = LG2_UINT64;
- {$ENDIF}
- (* size_t equivalent. *)
- LG2_SIZE_T = LG2_UINT64;
- (* Fake pointer type. It's needed to pass pointers as integer values in some
- methods. *)
- LG2_INTPTR_T = LG2_INT64;
- (* Fake pointer type. It's needed to pass pointers as integer values in some
- methods. *)
- LG2_UINTPTR_T = LG2_UINT64;
- {$ELSE}
- (* Signed 32/64bit integer values. *)
- LG2_LONG = LG2_INT32;
- (* Unsigned 32/64bit integer values. *)
- LG2_ULONG = LG2_UINT32;
- (* size_t equivalent. *)
- LG2_SIZE_T = LG2_UINT32;
- (* Fake pointer type. It's needed to pass pointers as integer values in some
- methods. *)
- LG2_INTPTR_T = LG2_INT32;
- (* Fake pointer type. It's needed to pass pointers as integer values in some
- methods. *)
- LG2_UINTPTR_T = LG2_UINT32;
- {$ENDIF}
- (* Another 64bit integer to store sizes. *)
- LG2_OFF_T = LG2_UINT;
- (* Float value. *)
- LG2_FLOAT = SINGLE;
- (* Double value. *)
- LG2_DOUBLE = DOUBLE;
- (* Strings. Used in parameters to convert Pascal's @code(STRING) to C's
- @code(char * )*)
- LG2_STR = ANSISTRING;
- (* Pointer. *)
- LG2_VOIDptr = LG2_POINTER;
- (* Pointer to text strings. Used to convert Pascal's @code(STRING) to C
- @code(char * ) *)
- {$IFDEF ISDELPHI2009ANDUP}
- LG2_STRptr = PAnsiChar;
- {$ELSE}
- LG2_STRptr = PCHAR;
- {$ENDIF}
- (* Pointer to integer. *)
- LG2_INTptr = ^LG2_INT;
- (* Pointer to float. *)
- LG2_FLOATptr = ^LG2_FLOAT;
- const
- GIT_SUCCESS = 0;
- GIT_ERROR = -1;
- type
- git_buf = record
- ptr: ^char;
- asize: cuint64;
- size: cuint64;
- end;
- git_repository_init_options = record
- version: LG2_UINT32;
- flags: LG2_UINT32;
- mode: LG2_UINT32;
- workdir_path: LG2_STR;
- description: LG2_STR;
- template_path: LG2_STR;
- initial_head: LG2_STR;
- origin_url: LG2_STR;
- end;
- git_repository_item_t = (
- GIT_REPOSITORY_ITEM_GITDIR,
- GIT_REPOSITORY_ITEM_WORKDIR,
- GIT_REPOSITORY_ITEM_COMMONDIR,
- GIT_REPOSITORY_ITEM_INDEX,
- GIT_REPOSITORY_ITEM_OBJECTS,
- GIT_REPOSITORY_ITEM_REFS,
- GIT_REPOSITORY_ITEM_PACKED_REFS,
- GIT_REPOSITORY_ITEM_REMOTES,
- GIT_REPOSITORY_ITEM_CONFIG,
- GIT_REPOSITORY_ITEM_INFO,
- GIT_REPOSITORY_ITEM_HOOKS,
- GIT_REPOSITORY_ITEM_LOGS,
- GIT_REPOSITORY_ITEM_MODULES,
- GIT_REPOSITORY_ITEM_WORKTREES
- );
- git_object_t = (
- GIT_OBJECT_ANY = -2,
- GIT_OBJECT_BAD = -1,
- GIT_OBJECT_COMMIT = 1,
- GIT_OBJECT_TREE = 2,
- GIT_OBJECT_BLOB = 3,
- GIT_OBJECT_TAG = 4,
- GIT_OBJECT_OFS_DELTA = 6,
- GIT_OBJECT_REF_DELTA = 7
- );
- git_repository_state_t = (
- GIT_REPOSITORY_STATE_NONE,
- GIT_REPOSITORY_STATE_MERGE,
- GIT_REPOSITORY_STATE_REVERT,
- GIT_REPOSITORY_STATE_REVERT_SEQUENCE,
- GIT_REPOSITORY_STATE_CHERRYPICK,
- GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE,
- GIT_REPOSITORY_STATE_BISECT,
- GIT_REPOSITORY_STATE_REBASE,
- GIT_REPOSITORY_STATE_REBASE_INTERACTIVE,
- GIT_REPOSITORY_STATE_REBASE_MERGE,
- GIT_REPOSITORY_STATE_APPLY_MAILBOX,
- GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE
- );
- Pgit_annotated_commit = LG2_POINTER;
- Pgit_buf = ^git_buf;
- Pgit_commit = LG2_POINTER;
- PPgit_commit = ^Pgit_commit;
- Pgit_config = LG2_POINTER;
- PPgit_config = ^Pgit_config;
- Pgit_oid = LG2_POINTER;
- Pgit_reference = LG2_POINTER;
- PPgit_reference = ^Pgit_reference;
- Pgit_repository = LG2_POINTER;
- PPgit_repository = ^Pgit_repository;
- Pgit_repository_init_options = ^git_repository_init_options;
- Pgit_tag = LG2_POINTER;
- Pgit_worktree = LG2_POINTER;
- Pgit_odb = LG2_POINTER;
- PPgit_odb = ^Pgit_odb;
- Pgit_refdb = LG2_POINTER;
- PPgit_refdb = ^Pgit_refdb;
- Pgit_index = LG2_POINTER;
- PPgit_index = ^Pgit_index;
- git_repository_fetchhead_foreach_cb = function(const ref_name: LG2_STR; const remote_url: LG2_STR; const oid: Pgit_oid; is_merge: LG2_UINT; payload: LG2_POINTER): LG2_INT;
- git_repository_mergehead_foreach_cb = function(const oid: Pgit_oid; payload: LG2_POINTER): LG2_INT;
- { global.h }
- procedure git_libgit2_init(); cdecl; external LIBGIT2_LIB_NAME;
- procedure git_libgit2_shutdown(); cdecl; external LIBGIT2_LIB_NAME;
- { repository.h }
- function git_repository_open(var repo_out: PPgit_repository; const path: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_open_from_worktree(var repo_out: PPgit_repository; var wt: Pgit_worktree): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_wrap_odb(var repo_out: PPgit_repository; var repo_odb: Pgit_odb): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_discover(var buf_out: Pgit_buf; const start_path: LG2_STR; across_fs: LG2_INT; const ceiling_dirs: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_open_ext(var repo_out: PPgit_repository; const path: LG2_STR; flags: LG2_UINT32; const ceiling_dirs: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_open_bare(var repo_out: PPgit_repository; const bare_path: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- procedure git_repository_free(var repo: Pgit_repository); cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_init(var repo_out: PPgit_repository; const path: LG2_STR; is_bare: LG2_BOOL): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_init_init_options(var opts: Pgit_repository_init_options; version: LG2_UINT32): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_init_ext(var repo_out: PPgit_repository; const repo_path: LG2_STR; var opts: Pgit_repository_init_options): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_head(var ref_out: PPgit_reference; repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_head_for_worktree(var ref_out: PPgit_reference; repo: Pgit_repository; const name: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_head_detached(const repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_head_detached_for_worktree(repo: Pgit_repository; const name: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_head_unborn(repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_is_empty(repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_item_path(var buf_out: Pgit_buf; const repo: Pgit_repository; const item: git_repository_item_t): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_path(const repo: Pgit_repository): LG2_STR; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_workdir(const repo: Pgit_repository): LG2_STR; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_commondir(const repo: Pgit_repository): LG2_STR; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_set_workdir(const repo: Pgit_repository; const workdir: LG2_STR; update_gitlink: LG2_INT): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_is_bare(const repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_is_worktree(const repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_config(var config_out: PPgit_config; repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_config_snapshot(var config_out: PPgit_config; repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_odb(var odb_out: PPgit_odb; repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_refdb(var refdb_out: PPgit_refdb; repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_index(var index_out: PPgit_index; repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_message(var buf_out: Pgit_buf; repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_message_remove(repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_state_cleanup(repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_fetchhead_foreach(repo: Pgit_repository; callback: git_repository_fetchhead_foreach_cb; payload: LG2_POINTER): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_mergehead_foreach(repo: Pgit_repository; callback: git_repository_mergehead_foreach_cb; payload: LG2_POINTER): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_hashfile(oid: Pgit_oid; repo: Pgit_repository; const path: LG2_STR; obj_type: git_object_t; const as_path: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_set_head(repo: Pgit_repository; refname: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_set_head_detached(repo: Pgit_repository; const commitish: Pgit_oid): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_set_head_detached_from_annotated(repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_detach_head(repo: Pgit_repository; const commitish: Pgit_annotated_commit): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_state(repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_set_namespace(repo: Pgit_repository; const nmspace: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_get_namespace(repo: Pgit_repository): LG2_STR; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_is_shallow(repo: Pgit_repository): LG2_BOOL; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_ident(name: LG2_STRptr; email: LG2_STRptr; const repo: Pgit_repository): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_repository_set_ident(repo: Pgit_repository; const name: LG2_STR; const email: LG2_STR): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- { commit.h }
- function git_commit_lookup(commit: PPgit_commit; repo: Pgit_repository; const id: Pgit_oid): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- function git_commit_lookup_prefix(commit: PPgit_commit; repo: Pgit_repository; const id: Pgit_oid; :csize_t): LG2_INT; cdecl; external LIBGIT2_LIB_NAME;
- type
- { SDK }
- TGitRepository = Class(TObject)
- Name: string;
- Email: string;
- Namespace: AnsiString;
- private
- repo: PPgit_repository;
- function GetWorkDir: AnsiString;
- function GetCommonDir: AnsiString;
- function GetPath: AnsiString;
- public
- constructor Create(const repository_path: string);
- destructor Destroy; override;
- { API }
- function IsEmpty: Boolean;
- property WorkDir: AnsiString read GetWorkDir;
- property CommonDir: AnsiString read GetCommonDir;
- property Path: AnsiString read GetPath;
- end;
- implementation
- { declarations }
- constructor TGitRepository.Create(const repository_path: String);
- begin
- if git_repository_open(repo, PAnsiChar(repository_path)) = GIT_SUCCESS then
- begin
- // Path := git_repository_path(repo^);
- // Workdir := git_repository_workdir(repo^);
- // Commondir := git_repository_commondir(repo^);
- // git_repository_ident(LG2_STRptr(string(Name)), LG2_STRptr(string(Email)), repo^);
- Logger.Send('TGitRepository.Create(open+ident:success): ' + Path);
- end
- else
- begin
- Logger.SendError('TGitRepository.Create(open:error): ' + repository_path);
- end;
- end;
- destructor TGitRepository.Destroy;
- begin
- if repo <> nil then
- begin
- git_repository_free(repo^);
- Logger.Send('TGitRepository.Destroy(free:success)');
- end;
- end;
- function TGitRepository.GetWorkDir(): AnsiString;
- begin
- if repo = nil then
- begin
- end
- else
- Result := git_repository_workdir(self.repo^);
- end;
- function TGitRepository.GetCommonDir(): AnsiString;
- begin
- Result := git_repository_commondir(self.repo^);
- end;
- function TGitRepository.GetPath(): AnsiString;
- begin
- Result := git_repository_path(self.repo^);
- end;
- function TGitRepository.IsEmpty: boolean;
- begin
- if repo <> nil then
- begin
- Result := git_repository_is_empty(repo^) = 1;
- end
- else
- Result := false;
- end;
- initialization
- { Delphi forces an INITIALIZATION section if FINALIZATION is used. }
- ;
- { Next code suggested by FPC mailing list user. This should fix some issues
- with memory. Removed as it seems to be fixed by Allegro itself. }
- { $if defined(cpui386) or defined(cpux86_64)}
- { SetExceptionMask(GetExceptionMask + [exZeroDivide, exInvalidOp]); }
- { $ENDIF}
- git_libgit2_init;
- finalization
- git_libgit2_shutdown;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement