From 2057bf1eb5aaf0a9fea2beb8083a3052936b34ea Mon Sep 17 00:00:00 2001 From: Galin Simeonov Date: Sun, 26 Sep 2021 19:12:03 +0300 Subject: generates a tree dump for the HEAD of all the branches --- .exrc | 37 ++++++++++++++++++++++++++++++++ git_part.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- git_part.h | 9 ++++++++ system_part.c | 21 ++++-------------- system_part.h | 3 +-- 5 files changed, 118 insertions(+), 20 deletions(-) create mode 100644 .exrc diff --git a/.exrc b/.exrc new file mode 100644 index 0000000..9cdfbae --- /dev/null +++ b/.exrc @@ -0,0 +1,37 @@ +if &cp | set nocp | endif +nmap  : +let s:cpo_save=&cpo +set cpo&vim +vmap gx NetrwBrowseXVis +nmap gx NetrwBrowseX +vnoremap NetrwBrowseXVis :call netrw#BrowseXVis() +nnoremap NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX())) +nmap h +nmap l +nmap j +nmap k +nmap :echo "F1 - print function key keybinds (normal mode) \nF2 - !t \nF5 - make \nF6 - make clean \nF7 - set make directory \nF9 - git status \nF10 - git diff" +nmap :set makeprg=make\ -C +nmap :make clean +nmap :wa:make -j4 +nmap :!git diff +nmap :!git status +nmap :!t +let &cpo=s:cpo_save +unlet s:cpo_save +set background=dark +set backspace=indent,eol,start +set cindent +set fileencodings=ucs-bom,utf-8,default,latin1 +set helplang=en +set makeprg=make\ -C/tmp/a +set nomodeline +set mouse=a +set omnifunc=syntaxcomplete +set printoptions=paper:letter +set ruler +set showtabline=0 +set suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc +set tabline=%{g:tabline} +set tagcase=ignore +" vim: set ft=vim : diff --git a/git_part.c b/git_part.c index f3b0877..0467206 100644 --- a/git_part.c +++ b/git_part.c @@ -44,6 +44,7 @@ void print_commits(int dir_fd,const git_reference *branch, git_repository *repo) FILE *log_file; FILE *diff_file; int diff_directory_fd; + int files_directory_fd; git_revwalk *walker; git_oid current; @@ -58,17 +59,24 @@ void print_commits(int dir_fd,const git_reference *branch, git_repository *repo) log_file=create_file(dir_fd,"log"); - diff_directory_fd=create_diff_dir(dir_fd); + diff_directory_fd=create_dir(dir_fd,"diffs"); + files_directory_fd=create_dir(dir_fd,"files"); while(!git_revwalk_next(¤t,walker)) { git_commit_lookup(¤t_commit,repo,¤t); git_commit_tree(¤t_tree,current_commit); + if(parent_tree!=NULL) { diff_file=create_file(diff_directory_fd,git_oid_tostr_s(¤t)); + print_diff(diff_file,parent_tree,current_tree,repo); + git_tree_free(parent_tree); + }else/*we only print the files of the HEAD*/ + { + print_files(files_directory_fd,current_tree,repo); } print_headers_and_commit_message(log_file,current_commit,¤t); @@ -108,4 +116,62 @@ void print_branches(git_repository *repo) git_branch_iterator_free(it); } +void print_files(int dir_fd,git_tree *tree,git_repository *repo) +{ + size_t number_of_entries; + size_t i; + const git_tree_entry *current_entry; + + number_of_entries=git_tree_entrycount(tree); + + for(i=0;i #include + +struct Print_Files_Context +{ + int base_dir_fd; + git_repository *repo; +}; + int print_diff_line(const git_diff_delta *delta,const git_diff_hunk *hunk,const git_diff_line *line,FILE *out); void print_diff(FILE *out,git_tree *parent_tree,git_tree *current_tree,git_repository *repo); void print_headers_and_commit_message(FILE* where,git_commit *current_commit,git_oid *current); void print_commits(int dir_fd,const git_reference *branch, git_repository *repo); +void print_files(int dir_fd,git_tree *tree,git_repository *repo); +int print_entry(const git_tree_entry *entry,int base_dir_fd,git_repository *repo); void print_branches(git_repository *repo); diff --git a/system_part.c b/system_part.c index aaf2301..526f9be 100644 --- a/system_part.c +++ b/system_part.c @@ -83,33 +83,20 @@ FILE* create_file(int branch_dir,const char *filename) die("Could not open the file '%s' for one of the branches\n",filename); return fdopen(fd,"w"); } -int create_files_dir(int branch_dir) +int create_dir(int base_dir,const char *dir_name) { int ret; - - ret=openat(branch_dir,"files",O_DIRECTORY|O_RDONLY); + ret=openat(base_dir,dir_name,O_DIRECTORY|O_RDONLY); if(ret!=-1) return ret; - ret=mkdirat(branch_dir,"files",0770); + mkdirat(base_dir,dir_name,0770); + ret=openat(base_dir,dir_name,O_DIRECTORY|O_RDONLY); if(ret==-1) die("Could not create the 'files' subdirectory of one of the branch dirs\n"); return ret; } -int create_diff_dir(int branch_dir) -{ - int ret; - - ret=openat(branch_dir,"diffs",O_DIRECTORY|O_RDONLY); - if(ret!=-1) - return ret; - mkdirat(branch_dir,"diffs",0770); - ret=openat(branch_dir,"diffs",O_DIRECTORY|O_RDONLY); - if(ret==-1) - die("Could not create the 'diffs' subdirectory of one of the branch dirs\n"); - return ret; -} void die(const char *format, ...) { diff --git a/system_part.h b/system_part.h index ac06166..5049312 100644 --- a/system_part.h +++ b/system_part.h @@ -25,8 +25,7 @@ void parse_options(int argc,char **argv); char* read_file(const char *filename); int create_branch_dir(const char *branch_name); FILE* create_file(int branch_dir,const char *filename); -int create_files_dir(int branch_dir); -int create_diff_dir(int branch_dir); +int create_dir(int base_dir,const char *dir_name); #endif -- cgit v1.2.3