summaryrefslogtreecommitdiffstats
path: root/git_part.c
diff options
context:
space:
mode:
Diffstat (limited to 'git_part.c')
-rw-r--r--git_part.c107
1 files changed, 77 insertions, 30 deletions
diff --git a/git_part.c b/git_part.c
index 0467206..fb6d18d 100644
--- a/git_part.c
+++ b/git_part.c
@@ -5,9 +5,19 @@
int print_diff_line(const git_diff_delta *delta,const git_diff_hunk *hunk,const git_diff_line *line,FILE *out)
{
size_t i;
+ if(line->origin=='+')
+ fprintf(out,"<div class=\"origin_added\">");
+ else if(line->origin=='-')
+ fprintf(out,"<div class=\"origin_removed\">");
+ else
+ fprintf(out,"<div class=\"origin_other\">");
+
fprintf(out,"%c ",line->origin);
for(i=0;i<line->content_len;++i)
fprintf(out,"%c",line->content[i]);
+
+ fprintf(out,"</div>");
+
return 0;
}
@@ -17,41 +27,44 @@ void print_diff(FILE *out,git_tree *parent_tree,git_tree *current_tree,git_repos
size_t number_of_deltas=0;
size_t i;
- git_diff_tree_to_tree(&diff_from_parent,repo,current_tree,parent_tree,NULL);
+ fprintf(out,"<pre>");
+ git_diff_tree_to_tree(&diff_from_parent,repo,parent_tree,current_tree,NULL);
git_diff_print(diff_from_parent,GIT_DIFF_FORMAT_PATCH_ID,(git_diff_line_cb)print_diff_line,out);
if(diff_from_parent)
git_diff_free(diff_from_parent);
+ fprintf(out,"</pre>");
}
-void print_headers_and_commit_message(FILE *where,git_commit *current_commit,git_oid *current)
+void print_headers_and_commit_message(FILE *where,git_commit *current_commit,const git_oid *current,_Bool has_diff)
{
const git_signature *who_commited;
- fprintf(where,"COMMIT: %s\n",git_oid_tostr_s(current));
+ fprintf(where,"<div class=\"commit_header commit_commit_header\">COMMIT: %s",git_oid_tostr_s(current));
+ if(has_diff)
+ fprintf(where,"<a href=\"diffs/%s.html\"> [DIFF]</a></div>\n",git_oid_tostr_s(current));
+ else
+ fprintf(where,"</div>\n");
who_commited=git_commit_committer(current_commit);
- fprintf(where,"AUTHOR: %s <%s>\n",who_commited->name,who_commited->email);
+ fprintf(where,"<div class=\"commit_header commit_author_header\">AUTHOR: %s &lt;%s&gt;</div>\n",who_commited->name,who_commited->email);
- fprintf(where,"DATE: %s\n",ctime(&who_commited->when.time));
+ fprintf(where,"<div class=\"commit_header commit_date_header\">DATE: %s</div>\n",ctime(&who_commited->when.time));
- fprintf(where,"\t%s\n",git_commit_message(current_commit));
+ fprintf(where,"<pre><div class=\"commit_header commit_message\">\t%s</div></pre>\n",git_commit_message(current_commit));
}
void print_commits(int dir_fd,const git_reference *branch, git_repository *repo)
{
const git_oid *id;
FILE *log_file;
- FILE *diff_file;
int diff_directory_fd;
int files_directory_fd;
git_revwalk *walker;
git_oid current;
git_commit *current_commit;
- git_time_t time_of_commit;
- git_tree *parent_tree=NULL;
- git_tree *current_tree;
+ git_commit *parent_commit=NULL;
git_revwalk_new(&walker,repo);
id=git_reference_target(branch);
@@ -62,32 +75,47 @@ void print_commits(int dir_fd,const git_reference *branch, git_repository *repo)
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(git_revwalk_next(&current,walker))
+ return;
- if(parent_tree!=NULL)
- {
- diff_file=create_file(diff_directory_fd,git_oid_tostr_s(&current));
+ git_commit_lookup(&current_commit,repo,&current);
- print_diff(diff_file,parent_tree,current_tree,repo);
+ print_files_top(files_directory_fd,current_commit,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);
+ while(!git_revwalk_next(&current,walker))
+ {
+ git_commit_lookup(&parent_commit,repo,&current);
+
+ print_commit(current_commit,parent_commit,log_file,diff_directory_fd,repo);
- parent_tree=current_tree;
git_commit_free(current_commit);
+ current_commit=parent_commit;
}
+ if(parent_commit!=NULL)
+ print_commit(current_commit,NULL,log_file,diff_directory_fd,repo);
git_revwalk_free(walker);
fclose(log_file);
}
+void print_commit(git_commit *current_commit,git_commit *parent_commit,FILE *log_file,int diff_directory_fd,git_repository *repo)
+{
+ git_tree *current_tree;
+ git_tree *parent_tree;
+ FILE *diff_file;
+
+ git_commit_tree(&current_tree,current_commit);
+ if(parent_commit==NULL)
+ parent_tree=NULL;
+ else
+ git_commit_tree(&parent_tree,parent_commit);
+
+ diff_file=create_file(diff_directory_fd,git_oid_tostr_s(git_commit_id(current_commit)));
+
+ print_diff(diff_file,parent_tree,current_tree,repo);
+
+ git_tree_free(parent_tree);
+ print_headers_and_commit_message(log_file,current_commit,git_commit_id(current_commit),1);
+}
void print_branches(git_repository *repo)
{
@@ -121,37 +149,55 @@ 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;
+ FILE *index_file;
number_of_entries=git_tree_entrycount(tree);
+ index_file=create_file(dir_fd,"index");
for(i=0;i<number_of_entries;++i)
{
current_entry=git_tree_entry_byindex(tree,i);
- print_entry(current_entry,dir_fd,repo);
+ print_entry(index_file,current_entry,dir_fd,repo);
+ fprintf(index_file,"\n<br>\n");
}
}
-int print_entry(const git_tree_entry *entry,int base_dir_fd,git_repository *repo)
+void print_files_top(int dir_fd,git_commit *top_commit,git_repository *repo)
+{
+ git_tree *tree;
+
+ git_commit_tree(&tree,top_commit);
+
+ print_files(dir_fd,tree,repo);
+}
+int print_entry(FILE *index_file,const git_tree_entry *entry,int base_dir_fd,git_repository *repo)
{
git_object *obj;
+ const git_oid *obj_oid;
const char *entry_name;
+ const char *entry_oid;
git_tree_entry_to_object(&obj,repo,entry);
+ obj_oid=git_object_id(obj);
+
entry_name=git_tree_entry_name(entry);
+ entry_oid=git_oid_tostr_s(obj_oid);
switch(git_object_type(obj))
{
case GIT_OBJECT_TREE:
+ push_html_link_for_tree(index_file,entry_name,entry_oid);
{
int new_dir_fd;
git_tree *tree;
tree=(git_tree*)obj;
- new_dir_fd=create_dir(base_dir_fd,entry_name);
+ new_dir_fd=create_dir(base_dir_fd,entry_oid);
print_files(new_dir_fd,tree,repo);
}
break;
case GIT_OBJECT_BLOB:
+ push_html_link_for_blob(index_file,entry_name,entry_oid);
{
FILE *blob_file;
const void *blob_data;
@@ -160,7 +206,8 @@ int print_entry(const git_tree_entry *entry,int base_dir_fd,git_repository *repo
blob=(git_blob*)obj;
- blob_file=create_file(base_dir_fd,entry_name);
+ blob_file=create_file(base_dir_fd,entry_oid);
+
blob_size=git_blob_rawsize(blob);
blob_data=git_blob_rawcontent(blob);