/* * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, * as published by the Free Software Foundation. * * In addition to the permissions in the GNU General Public License, * the authors give you unlimited permission to link the compiled * version of this file into combinations with other programs, * and to distribute those combinations without any restriction * coming from the use of this file. (The General Public License * restrictions do apply in other respects; for example, they cover * modification of the file, and distribution when not linked into * a combined executable.) * * This file is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef INCLUDE_git_index_h__ #define INCLUDE_git_index_h__ #include "common.h" #include "types.h" #include "oid.h" /** * @file git2/index.h * @brief Git index parsing and manipulation routines * @defgroup git_index Git index parsing and manipulation routines * @ingroup Git * @{ */ GIT_BEGIN_DECL #define GIT_IDXENTRY_NAMEMASK (0x0fff) #define GIT_IDXENTRY_STAGEMASK (0x3000) #define GIT_IDXENTRY_EXTENDED (0x4000) #define GIT_IDXENTRY_VALID (0x8000) #define GIT_IDXENTRY_STAGESHIFT 12 /** Time used in a git index entry */ typedef struct { git_time_t seconds; /* nsec should not be stored as time_t compatible */ unsigned int nanoseconds; } git_index_time; /** Memory representation of a file entry in the index. */ typedef struct git_index_entry { git_index_time ctime; git_index_time mtime; unsigned int dev; unsigned int ino; unsigned int mode; unsigned int uid; unsigned int gid; git_off_t file_size; git_oid oid; unsigned short flags; unsigned short flags_extended; char *path; } git_index_entry; /** * Create a new Git index object as a memory representation * of the Git index file in 'index_path', without a repository * to back it. * * Since there is no ODB behind this index, any Index methods * which rely on the ODB (e.g. index_add) will fail with the * GIT_EBAREINDEX error code. * * @param index the pointer for the new index * @param index_path the path to the index file in disk * @return 0 on success; error code otherwise */ GIT_EXTERN(int) git_index_open_bare(git_index **index, const char *index_path); /** * Open the Index inside the git repository pointed * by 'repo'. * * @param repo the git repo which owns the index * @param index_path the path to the index file in disk * @return 0 on success; error code otherwise */ GIT_EXTERN(int) git_index_open_inrepo(git_index **index, git_repository *repo); /** * Clear the contents (all the entries) of an index object. * This clears the index object in memory; changes must be manually * written to disk for them to take effect. * * @param index an existing index object */ GIT_EXTERN(void) git_index_clear(git_index *index); /** * Free an existing index object. * * @param index an existing index object */ GIT_EXTERN(void) git_index_free(git_index *index); /** * Update the contents of an existing index object in memory * by reading from the hard disk. * * @param index an existing index object * @return 0 on success, otherwise an error code */ GIT_EXTERN(int) git_index_read(git_index *index); /** * Write an existing index object from memory back to disk * using an atomic file lock. * * @param index an existing index object * @return 0 on success, otherwise an error code */ GIT_EXTERN(int) git_index_write(git_index *index); /** * Find the first index of any entires which point to given * path in the Git index. * * @param index an existing index object * @param path path to search * @return an index >= 0 if found, -1 otherwise */ GIT_EXTERN(int) git_index_find(git_index *index, const char *path); /** * Add or update an index entry from a file in disk. * * @param index an existing index object * @param path filename to add * @param stage stage for the entry * @return 0 on success, otherwise an error code */ GIT_EXTERN(int) git_index_add(git_index *index, const char *path, int stage); /** * Remove an entry from the index * * @param index an existing index object * @param position position of the entry to remove * @return 0 on success, otherwise an error code */ GIT_EXTERN(int) git_index_remove(git_index *index, int position); /** * Insert an entry into the index. * A full copy (including the 'path' string) of the given * 'source_entry' will be inserted on the index; if the index * already contains an entry for the same path, the entry * will be updated. * * @param index an existing index object * @param source_entry new entry object * @return 0 on success, otherwise an error code */ GIT_EXTERN(int) git_index_insert(git_index *index, const git_index_entry *source_entry); /** * Get a pointer to one of the entries in the index * * This entry can be modified, and the changes will be written * back to disk on the next write() call. * * @param index an existing index object * @param n the position of the entry * @return a pointer to the entry; NULL if out of bounds */ GIT_EXTERN(git_index_entry *) git_index_get(git_index *index, int n); /** * Get the count of entries currently in the index * * @param index an existing index object * @return integer of count of current entries */ GIT_EXTERN(unsigned int) git_index_entrycount(git_index *index); /** @} */ GIT_END_DECL #endif