/* * Copyright (c) 2021 joshua stein * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef __REPO_H__ #define __REPO_H__ #include #include "bile.h" #define AMEND_CREATOR 'AMND' #define REPO_TYPE 'AMRP' #define REPO_FILE_RTYPE 'AFIL' #define REPO_AMENDMENT_RTYPE 'CMMT' #define REPO_DIFF_RTYPE 'DIFF' #define REPO_TEXT_RTYPE 'TEXT' #define REPO_VERS_RTYPE 'RVER' #define DIFF_FILE_TYPE 'TEXT' #define REPO_DIFF_TOO_BIG "\r[ Diff too large to view, %lu bytes not shown ]" #define REPO_CUR_VERS 3 struct repo_file { short id; char sort_filename[2]; char filename[256]; OSType type; OSType creator; unsigned long ctime; unsigned long mtime; unsigned char flags; #define REPO_FILE_DELETED (1 << 0) }; struct repo_file_attrs { char type[4]; char creator[4]; unsigned long ctime; unsigned long mtime; }; struct diffed_file { struct repo_file *file; short flags; #define DIFFED_FILE_TEXT (1 << 0) #define DIFFED_FILE_METADATA (1 << 1) }; struct repo_amendment { short id; time_t date; char author[32]; short nfiles; short *file_ids; short adds; short subs; short log_len; Handle log; }; struct repo { struct bile *bile; short nfiles; struct repo_file **files; short next_file_id; short namendments; struct repo_amendment **amendments; short next_amendment_id; bool unloaded_amendments; }; struct repo *repo_open(AppFile *file); struct repo *repo_create(void); void repo_close(struct repo *repo); void repo_load_amendments(struct repo *repo, bool fill_in); struct repo_amendment *repo_parse_amendment(unsigned long id, unsigned char *data, size_t size); struct repo_file * repo_parse_file(unsigned long id, unsigned char *data, size_t size); struct repo_file *repo_file_with_id(struct repo *repo, short id); void repo_show_diff_text(struct repo *repo, struct repo_amendment *amendment, TEHandle te); struct repo_file *repo_add_file(struct repo *repo); void repo_file_mark_for_deletion(struct repo *repo, struct repo_file *file); short repo_diff_file(struct repo *repo, struct repo_file *file); short repo_file_changed(struct repo *repo, struct repo_file *file); short repo_checkout_file(struct repo *repo, struct repo_file *file, short vrefnum, Str255 filename); void repo_export_amendment(struct repo *repo, struct repo_amendment *amendment, short vrefnum, Str255 filename); void repo_amend(struct repo *repo, struct diffed_file *diffed_files, short nfiles, short adds, short subs, char *author, Handle log, short loglen, Handle diff, unsigned long difflen); void repo_marshall_amendment(struct repo_amendment *amendment, char **retdata, unsigned long *retlen); void repo_backup(struct repo *repo); #endif