diff options
Diffstat (limited to 'git.h')
-rw-r--r-- | git.h | 399 |
1 files changed, 399 insertions, 0 deletions
@@ -0,0 +1,399 @@ +#ifndef GIT_H +#define GIT_H + + +/* + * from git:git-compat-util.h + */ + + +#ifndef FLEX_ARRAY +#if defined(__GNUC__) && (__GNUC__ < 3) +#define FLEX_ARRAY 0 +#else +#define FLEX_ARRAY /* empty */ +#endif +#endif + + +#include <unistd.h> +#include <stdio.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stddef.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <errno.h> +#include <limits.h> +#include <sys/param.h> +#include <netinet/in.h> +#include <sys/types.h> +#include <dirent.h> +#include <time.h> + + +static inline char* xstrdup(const char *str) +{ + char *ret = strdup(str); + if (!ret) + die("Out of memory, strdup failed"); + return ret; +} + +static inline void *xmalloc(size_t size) +{ + void *ret = malloc(size); + if (!ret && !size) + ret = malloc(1); + if (!ret) + die("Out of memory, malloc failed"); +#ifdef XMALLOC_POISON + memset(ret, 0xA5, size); +#endif + return ret; +} + +static inline void *xrealloc(void *ptr, size_t size) +{ + void *ret = realloc(ptr, size); + if (!ret && !size) + ret = realloc(ptr, 1); + if (!ret) + die("Out of memory, realloc failed"); + return ret; +} + +static inline void *xcalloc(size_t nmemb, size_t size) +{ + void *ret = calloc(nmemb, size); + if (!ret && (!nmemb || !size)) + ret = calloc(1, 1); + if (!ret) + die("Out of memory, calloc failed"); + return ret; +} + +static inline ssize_t xread(int fd, void *buf, size_t len) +{ + ssize_t nr; + while (1) { + nr = read(fd, buf, len); + if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) + continue; + return nr; + } +} + +static inline ssize_t xwrite(int fd, const void *buf, size_t len) +{ + ssize_t nr; + while (1) { + nr = write(fd, buf, len); + if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) + continue; + return nr; + } +} + + + + +/* + * from git:cache.h + */ + + +/* Convert to/from hex/sha1 representation */ +#define MINIMUM_ABBREV 4 +#define DEFAULT_ABBREV 7 + + +extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size); + + + + +/* + * from git:object.h + */ + +struct object_list { + struct object *item; + struct object_list *next; +}; + +struct object_refs { + unsigned count; + struct object *base; + struct object *ref[FLEX_ARRAY]; /* more */ +}; + +struct object_array { + unsigned int nr; + unsigned int alloc; + struct object_array_entry { + struct object *item; + const char *name; + } *objects; +}; + +#define TYPE_BITS 3 +#define FLAG_BITS 27 + +/* + * The object type is stored in 3 bits. + */ +struct object { + unsigned parsed : 1; + unsigned used : 1; + unsigned type : TYPE_BITS; + unsigned flags : FLAG_BITS; + unsigned char sha1[20]; +}; + + +/* + * from git:tree.h + */ + +struct tree { + struct object object; + void *buffer; + unsigned long size; +}; + + + + +/* from git:commit.h */ + +struct commit_list { + struct commit *item; + struct commit_list *next; +}; + +struct commit { + struct object object; + void *util; + unsigned long date; + struct commit_list *parents; + struct tree *tree; + char *buffer; +}; + + +/* Commit formats */ +enum cmit_fmt { + CMIT_FMT_RAW, + CMIT_FMT_MEDIUM, + CMIT_FMT_DEFAULT = CMIT_FMT_MEDIUM, + CMIT_FMT_SHORT, + CMIT_FMT_FULL, + CMIT_FMT_FULLER, + CMIT_FMT_ONELINE, + CMIT_FMT_EMAIL, + + CMIT_FMT_UNSPECIFIED, +}; + + + +struct commit *lookup_commit(const unsigned char *sha1); +struct commit *lookup_commit_reference(const unsigned char *sha1); +struct commit *lookup_commit_reference_gently(const unsigned char *sha1, + int quiet); + +typedef void (*topo_sort_set_fn_t)(struct commit*, void *data); +typedef void* (*topo_sort_get_fn_t)(struct commit*); + + + + +/* + * from git:diff.h + */ + + +struct rev_info; +struct diff_options; +struct diff_queue_struct; + +typedef void (*change_fn_t)(struct diff_options *options, + unsigned old_mode, unsigned new_mode, + const unsigned char *old_sha1, + const unsigned char *new_sha1, + const char *base, const char *path); + +typedef void (*add_remove_fn_t)(struct diff_options *options, + int addremove, unsigned mode, + const unsigned char *sha1, + const char *base, const char *path); + +typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, + struct diff_options *options, void *data); + +#define DIFF_FORMAT_RAW 0x0001 +#define DIFF_FORMAT_DIFFSTAT 0x0002 +#define DIFF_FORMAT_NUMSTAT 0x0004 +#define DIFF_FORMAT_SUMMARY 0x0008 +#define DIFF_FORMAT_PATCH 0x0010 + +/* These override all above */ +#define DIFF_FORMAT_NAME 0x0100 +#define DIFF_FORMAT_NAME_STATUS 0x0200 +#define DIFF_FORMAT_CHECKDIFF 0x0400 + +/* Same as output_format = 0 but we know that -s flag was given + * and we should not give default value to output_format. + */ +#define DIFF_FORMAT_NO_OUTPUT 0x0800 + +#define DIFF_FORMAT_CALLBACK 0x1000 + +struct diff_options { + const char *filter; + const char *orderfile; + const char *pickaxe; + const char *single_follow; + unsigned recursive:1, + tree_in_recursive:1, + binary:1, + text:1, + full_index:1, + silent_on_remove:1, + find_copies_harder:1, + color_diff:1, + color_diff_words:1; + int context; + int break_opt; + int detect_rename; + int line_termination; + int output_format; + int pickaxe_opts; + int rename_score; + int reverse_diff; + int rename_limit; + int setup; + int abbrev; + const char *msg_sep; + const char *stat_sep; + long xdl_opts; + + int stat_width; + int stat_name_width; + + int nr_paths; + const char **paths; + int *pathlens; + change_fn_t change; + add_remove_fn_t add_remove; + diff_format_fn_t format_callback; + void *format_callback_data; +}; + +enum color_diff { + DIFF_RESET = 0, + DIFF_PLAIN = 1, + DIFF_METAINFO = 2, + DIFF_FRAGINFO = 3, + DIFF_FILE_OLD = 4, + DIFF_FILE_NEW = 5, + DIFF_COMMIT = 6, + DIFF_WHITESPACE = 7, +}; + + + + + + + +/* + * from git:revision.h + */ + +struct rev_info; +struct log_info; + +typedef void (prune_fn_t)(struct rev_info *revs, struct commit *commit); + +struct rev_info { + /* Starting list */ + struct commit_list *commits; + struct object_array pending; + + /* Basic information */ + const char *prefix; + void *prune_data; + prune_fn_t *prune_fn; + + /* Traversal flags */ + unsigned int dense:1, + no_merges:1, + no_walk:1, + remove_empty_trees:1, + simplify_history:1, + lifo:1, + topo_order:1, + tag_objects:1, + tree_objects:1, + blob_objects:1, + edge_hint:1, + limited:1, + unpacked:1, /* see also ignore_packed below */ + boundary:1, + parents:1; + + /* Diff flags */ + unsigned int diff:1, + full_diff:1, + show_root_diff:1, + no_commit_id:1, + verbose_header:1, + ignore_merges:1, + combine_merges:1, + dense_combined_merges:1, + always_show_header:1; + + /* Format info */ + unsigned int shown_one:1, + abbrev_commit:1, + relative_date:1; + + const char **ignore_packed; /* pretend objects in these are unpacked */ + int num_ignore_packed; + + unsigned int abbrev; + enum cmit_fmt commit_format; + struct log_info *loginfo; + int nr, total; + const char *mime_boundary; + const char *message_id; + const char *ref_message_id; + const char *add_signoff; + const char *extra_headers; + + /* Filter by commit log message */ + struct grep_opt *grep_filter; + + /* special limits */ + int max_count; + unsigned long max_age; + unsigned long min_age; + + /* diff info for patches and for paths limiting */ + struct diff_options diffopt; + struct diff_options pruning; + + topo_sort_set_fn_t topo_setter; + topo_sort_get_fn_t topo_getter; +}; + + +extern struct commit *get_revision(struct rev_info *revs); + + + + +#endif /* GIT_H */ |