@ -31,39 +31,63 @@ static void print_line(char *line, int len)
line [ len - 1 ] = c ;
}
static void header ( unsigned char * sha1 , char * path1 ,
unsigned char * sha2 , char * path2 )
static void header ( unsigned char * sha1 , char * path1 , int mode1 ,
unsigned char * sha2 , char * path2 , int mode2 )
{
char * abbrev1 , * abbrev2 ;
if ( is_null_sha1 ( sha1 ) )
path1 = " dev/null " ;
if ( is_null_sha1 ( sha2 ) )
path2 = " dev/null " ;
int subproject ;
subproject = ( S_ISDIRLNK ( mode1 ) | | S_ISDIRLNK ( mode2 ) ) ;
html ( " <tr><td> " ) ;
html ( " <div class='head'> " ) ;
html ( " diff --git a/ " ) ;
html_txt ( path1 ) ;
html ( " b/ " ) ;
html_txt ( path2 ) ;
abbrev1 = xstrdup ( find_unique_abbrev ( sha1 , DEFAULT_ABBREV ) ) ;
abbrev2 = xstrdup ( find_unique_abbrev ( sha2 , DEFAULT_ABBREV ) ) ;
htmlf ( " \n index %s..%s " , abbrev1 , abbrev2 ) ;
free ( abbrev1 ) ;
free ( abbrev2 ) ;
html ( " \n --- a/ " ) ;
html_txt ( path1 ) ;
html ( " \n +++ b/ " ) ;
html_txt ( path2 ) ;
if ( is_null_sha1 ( sha1 ) )
path1 = " dev/null " ;
if ( is_null_sha1 ( sha2 ) )
path2 = " dev/null " ;
if ( mode1 = = 0 )
htmlf ( " <br/>new file mode %.6o " , mode2 ) ;
if ( mode2 = = 0 )
htmlf ( " <br/>deleted file mode %.6o " , mode1 ) ;
if ( ! subproject ) {
abbrev1 = xstrdup ( find_unique_abbrev ( sha1 , DEFAULT_ABBREV ) ) ;
abbrev2 = xstrdup ( find_unique_abbrev ( sha2 , DEFAULT_ABBREV ) ) ;
htmlf ( " <br/>index %s..%s " , abbrev1 , abbrev2 ) ;
free ( abbrev1 ) ;
free ( abbrev2 ) ;
if ( mode1 ! = 0 & & mode2 ! = 0 ) {
htmlf ( " %.6o " , mode1 ) ;
if ( mode2 ! = mode1 )
htmlf ( " ..%.6o " , mode2 ) ;
}
html ( " <br/>--- a/ " ) ;
html_txt ( path1 ) ;
html ( " <br/>+++ b/ " ) ;
html_txt ( path2 ) ;
}
html ( " </div> " ) ;
}
static void filepair_cb ( struct diff_filepair * pair )
{
header ( pair - > one - > sha1 , pair - > one - > path ,
pair - > two - > sha1 , pair - > two - > path ) ;
header ( pair - > one - > sha1 , pair - > one - > path , pair - > one - > mode ,
pair - > two - > sha1 , pair - > two - > path , pair - > two - > mode ) ;
if ( S_ISDIRLNK ( pair - > one - > mode ) | | S_ISDIRLNK ( pair - > two - > mode ) ) {
if ( S_ISDIRLNK ( pair - > one - > mode ) )
print_line ( fmt ( " -Subproject %s " , sha1_to_hex ( pair - > one - > sha1 ) ) , 52 ) ;
if ( S_ISDIRLNK ( pair - > two - > mode ) )
print_line ( fmt ( " +Subproject %s " , sha1_to_hex ( pair - > two - > sha1 ) ) , 52 ) ;
return ;
}
if ( cgit_diff_files ( pair - > one - > sha1 , pair - > two - > sha1 , print_line ) )
cgit_print_error ( " Error running diff " ) ;
html ( " </tr></td> " ) ;
}
void cgit_print_diff ( const char * head , const char * old_hex , const char * new_hex , char * path )
@ -100,7 +124,7 @@ void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex,
switch ( type ) {
case OBJ_BLOB :
html ( " <tr><td> " ) ;
header ( sha1 , path , sha2 , path ) ;
header ( sha1 , path , 0644 , sha2 , path , 0644 ) ;
if ( cgit_diff_files ( sha1 , sha2 , print_line ) )
cgit_print_error ( " Error running diff " ) ;
html ( " </tr></td> " ) ;