summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGalin Simeonov <gts@volconst.com>2021-09-26 19:12:03 +0300
committerGalin Simeonov <gts@volconst.com>2021-09-26 19:12:03 +0300
commit2057bf1eb5aaf0a9fea2beb8083a3052936b34ea (patch)
tree19a2324ec951ce6d4b81de766d18d6d17b3e61a0
parent7211f9c57204dc3b27327fc92352d99ad080a8db (diff)
downloadvolgit-2057bf1eb5aaf0a9fea2beb8083a3052936b34ea.tar.gz
generates a tree dump for the HEAD of all the branches
-rw-r--r--.exrc37
-rw-r--r--git_part.c68
-rw-r--r--git_part.h9
-rw-r--r--system_part.c21
-rw-r--r--system_part.h3
5 files changed, 118 insertions, 20 deletions
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 <Plug>NetrwBrowseXVis
+nmap gx <Plug>NetrwBrowseX
+vnoremap <silent> <Plug>NetrwBrowseXVis :call netrw#BrowseXVis()
+nnoremap <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX()))
+nmap <Left> h
+nmap <Right> l
+nmap <Down> j
+nmap <Up> k
+nmap <F1> :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"<NL>
+nmap <F7> :set makeprg=make\ -C
+nmap <F6> :make clean<NL>
+nmap <F5> :wa<NL>:make -j4<NL>
+nmap <F10> :!git diff<NL>
+nmap <F9> :!git status<NL>
+nmap <F2> :!t<NL>
+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(&current,walker))
{
git_commit_lookup(&current_commit,repo,&current);
git_commit_tree(&current_tree,current_commit);
+
if(parent_tree!=NULL)
{
diff_file=create_file(diff_directory_fd,git_oid_tostr_s(&current));
+
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,&current);
@@ -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<number_of_entries;++i)
+ {
+ current_entry=git_tree_entry_byindex(tree,i);
+ print_entry(current_entry,dir_fd,repo);
+ }
+}
+int print_entry(const git_tree_entry *entry,int base_dir_fd,git_repository *repo)
+{
+ git_object *obj;
+ const char *entry_name;
+
+ git_tree_entry_to_object(&obj,repo,entry);
+ entry_name=git_tree_entry_name(entry);
+
+ switch(git_object_type(obj))
+ {
+ case GIT_OBJECT_TREE:
+ {
+ int new_dir_fd;
+ git_tree *tree;
+
+ tree=(git_tree*)obj;
+
+ new_dir_fd=create_dir(base_dir_fd,entry_name);
+ print_files(new_dir_fd,tree,repo);
+ }
+ break;
+ case GIT_OBJECT_BLOB:
+ {
+ FILE *blob_file;
+ const void *blob_data;
+ size_t blob_size;
+ git_blob *blob;
+
+ blob=(git_blob*)obj;
+
+ blob_file=create_file(base_dir_fd,entry_name);
+ blob_size=git_blob_rawsize(blob);
+ blob_data=git_blob_rawcontent(blob);
+
+ fwrite(blob_data,blob_size,1,blob_file);
+
+ fclose(blob_file);
+ }
+ break;
+ }
+
+ git_object_free(obj);
+ return 0;
+}
#endif
diff --git a/git_part.h b/git_part.h
index f1f8072..7b7d896 100644
--- a/git_part.h
+++ b/git_part.h
@@ -4,10 +4,19 @@
#include <git2.h>
#include <system_part.h>
+
+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