@ -13,7 +13,7 @@
struct walk_tree_context {
const char * match_path ;
unsigned char * matched_sha1 ;
struct object_id matched_oid ;
unsigned int found_path : 1 ;
unsigned int file_only : 1 ;
} ;
@ -28,14 +28,14 @@ static int walk_tree(const unsigned char *sha1, struct strbuf *base,
if ( strncmp ( base - > buf , walk_tree_ctx - > match_path , base - > len )
| | strcmp ( walk_tree_ctx - > match_path + base - > len , pathname ) )
return READ_TREE_RECURSIVE ;
memmove ( walk_tree_ctx - > matched_sha1 , sha1 , 20 ) ;
hashcpy ( walk_tree_ctx - > matched_oid . hash , sha1 ) ;
walk_tree_ctx - > found_path = 1 ;
return 0 ;
}
int cgit_ref_path_exists ( const char * path , const char * ref , int file_only )
{
unsigned char sha1 [ 20 ] ;
struct object_id oid ;
unsigned long size ;
struct pathspec_item path_items = {
. match = path ,
@ -47,22 +47,22 @@ int cgit_ref_path_exists(const char *path, const char *ref, int file_only)
} ;
struct walk_tree_context walk_tree_ctx = {
. match_path = path ,
. matched_sha1 = sha1 ,
. matched_oid = oid ,
. found_path = 0 ,
. file_only = file_only
} ;
if ( get_sha1 ( ref , sha1 ) )
if ( get_oid ( ref , & oid ) )
return 0 ;
if ( sha1_object_info ( sha1 , & size ) ! = OBJ_COMMIT )
if ( sha1_object_info ( oid . hash , & size ) ! = OBJ_COMMIT )
return 0 ;
read_tree_recursive ( lookup_commit_reference ( sha1 ) - > tree , " " , 0 , 0 , & paths , walk_tree , & walk_tree_ctx ) ;
read_tree_recursive ( lookup_commit_reference ( oid . hash ) - > tree , " " , 0 , 0 , & paths , walk_tree , & walk_tree_ctx ) ;
return walk_tree_ctx . found_path ;
}
int cgit_print_file ( char * path , const char * head , int file_only )
{
unsigned char sha1 [ 20 ] ;
struct object_id oid ;
enum object_type type ;
char * buf ;
unsigned long size ;
@ -77,24 +77,24 @@ int cgit_print_file(char *path, const char *head, int file_only)
} ;
struct walk_tree_context walk_tree_ctx = {
. match_path = path ,
. matched_sha1 = sha1 ,
. matched_oid = oid ,
. found_path = 0 ,
. file_only = file_only
} ;
if ( get_sha1 ( head , sha1 ) )
if ( get_oid ( head , & oid ) )
return - 1 ;
type = sha1_object_info ( sha1 , & size ) ;
type = sha1_object_info ( oid . hash , & size ) ;
if ( type = = OBJ_COMMIT ) {
commit = lookup_commit_reference ( sha1 ) ;
commit = lookup_commit_reference ( oid . hash ) ;
read_tree_recursive ( commit - > tree , " " , 0 , 0 , & paths , walk_tree , & walk_tree_ctx ) ;
if ( ! walk_tree_ctx . found_path )
return - 1 ;
type = sha1_object_info ( sha1 , & size ) ;
type = sha1_object_info ( oid . hash , & size ) ;
}
if ( type = = OBJ_BAD )
return - 1 ;
buf = read_sha1_file ( sha1 , & type , & size ) ;
buf = read_sha1_file ( oid . hash , & type , & size ) ;
if ( ! buf )
return - 1 ;
buf [ size ] = ' \0 ' ;
@ -105,7 +105,7 @@ int cgit_print_file(char *path, const char *head, int file_only)
void cgit_print_blob ( const char * hex , char * path , const char * head , int file_only )
{
unsigned char sha1 [ 20 ] ;
struct object_id oid ;
enum object_type type ;
char * buf ;
unsigned long size ;
@ -120,31 +120,31 @@ void cgit_print_blob(const char *hex, char *path, const char *head, int file_onl
} ;
struct walk_tree_context walk_tree_ctx = {
. match_path = path ,
. matched_sha1 = sha1 ,
. matched_oid = oid ,
. found_path = 0 ,
. file_only = file_only
} ;
if ( hex ) {
if ( get_sha1_hex ( hex , sha1 ) ) {
if ( get_oid_hex ( hex , & oid ) ) {
cgit_print_error_page ( 400 , " Bad request " ,
" Bad hex value: %s " , hex ) ;
return ;
}
} else {
if ( get_sha1 ( head , sha1 ) ) {
if ( get_oid ( head , & oid ) ) {
cgit_print_error_page ( 404 , " Not found " ,
" Bad ref: %s " , head ) ;
return ;
}
}
type = sha1_object_info ( sha1 , & size ) ;
type = sha1_object_info ( oid . hash , & size ) ;
if ( ( ! hex ) & & type = = OBJ_COMMIT & & path ) {
commit = lookup_commit_reference ( sha1 ) ;
commit = lookup_commit_reference ( oid . hash ) ;
read_tree_recursive ( commit - > tree , " " , 0 , 0 , & paths , walk_tree , & walk_tree_ctx ) ;
type = sha1_object_info ( sha1 , & size ) ;
type = sha1_object_info ( oid . hash , & size ) ;
}
if ( type = = OBJ_BAD ) {
@ -153,7 +153,7 @@ void cgit_print_blob(const char *hex, char *path, const char *head, int file_onl
return ;
}
buf = read_sha1_file ( sha1 , & type , & size ) ;
buf = read_sha1_file ( oid . hash , & type , & size ) ;
if ( ! buf ) {
cgit_print_error_page ( 500 , " Internal server error " ,
" Error reading object %s " , hex ) ;