@ -55,105 +55,59 @@ static int write_tar_bzip2_archive(struct archiver_args *args)
return write_compressed_tar_archive ( args , " bzip2 " ) ;
}
static const struct snapshot_archive_t {
const char * suffix ;
const char * mimetype ;
write_archive_fn_t write_func ;
int bit ;
} snapshot_archives [ ] = {
const struct cgit_snapshot_format cgit_snapshot_formats [ ] = {
{ " .zip " , " application/x-zip " , write_zip_archive , 0x1 } ,
{ " .tar.gz " , " application/x-tar " , write_tar_gzip_archive , 0x2 } ,
{ " .tar.bz2 " , " application/x-tar " , write_tar_bzip2_archive , 0x4 } ,
{ " .tar " , " application/x-tar " , write_tar_archive , 0x8 }
{ " .tar " , " application/x-tar " , write_tar_archive , 0x8 } ,
{ }
} ;
# define snapshot_archives_len (sizeof(snapshot_archives) / sizeof(*snapshot_archives))
void cgit_print_snapshot ( const char * head , const char * hex , const char * prefix ,
const char * filename , int snapshots )
static int make_snapshot ( const struct cgit_snapshot_format * format ,
const char * hex , const char * prefix ,
const char * filename )
{
const struct snapshot_archive_t * sat ;
struct archiver_args args ;
struct commit * commit ;
unsigned char sha1 [ 20 ] ;
int f , sl , fnl = strlen ( filename ) ;
for ( f = 0 ; f < snapshot_archives_len ; f + + ) {
sat = & snapshot_archives [ f ] ;
if ( ! ( snapshots & sat - > bit ) )
continue ;
sl = strlen ( sat - > suffix ) ;
if ( fnl < sl | | strcmp ( & filename [ fnl - sl ] , sat - > suffix ) )
continue ;
if ( ! hex )
hex = head ;
if ( get_sha1 ( hex , sha1 ) ) {
cgit_print_error ( fmt ( " Bad object id: %s " , hex ) ) ;
return ;
}
commit = lookup_commit_reference ( sha1 ) ;
if ( ! commit ) {
cgit_print_error ( fmt ( " Not a commit reference: %s " , hex ) ) ;
return ; ;
}
memset ( & args , 0 , sizeof ( args ) ) ;
args . base = fmt ( " %s/ " , prefix ) ;
args . tree = commit - > tree ;
args . time = commit - > date ;
ctx . page . mimetype = xstrdup ( sat - > mimetype ) ;
ctx . page . filename = xstrdup ( filename ) ;
cgit_print_http_headers ( & ctx ) ;
( * sat - > write_func ) ( & args ) ;
return ;
if ( get_sha1 ( hex , sha1 ) ) {
cgit_print_error ( fmt ( " Bad object id: %s " , hex ) ) ;
return 1 ;
}
cgit_print_error ( fmt ( " Unsupported snapshot format: %s " , filename ) ) ;
}
void cgit_print_snapshot_links ( const char * repo , const char * head ,
const char * hex , int snapshots )
{
const struct snapshot_archive_t * sat ;
char * filename ;
int f ;
for ( f = 0 ; f < snapshot_archives_len ; f + + ) {
sat = & snapshot_archives [ f ] ;
if ( ! ( snapshots & sat - > bit ) )
continue ;
filename = fmt ( " %s-%s%s " , cgit_repobasename ( repo ) , hex ,
sat - > suffix ) ;
cgit_snapshot_link ( filename , NULL , NULL , ( char * ) head ,
( char * ) hex , filename ) ;
html ( " <br/> " ) ;
commit = lookup_commit_reference ( sha1 ) ;
if ( ! commit ) {
cgit_print_error ( fmt ( " Not a commit reference: %s " , hex ) ) ;
return 1 ;
}
memset ( & args , 0 , sizeof ( args ) ) ;
args . base = fmt ( " %s/ " , prefix ) ;
args . tree = commit - > tree ;
args . time = commit - > date ;
ctx . page . mimetype = xstrdup ( format - > mimetype ) ;
ctx . page . filename = xstrdup ( filename ) ;
cgit_print_http_headers ( & ctx ) ;
format - > write_func ( & args ) ;
return 0 ;
}
int cgit_parse_snapshots_mask ( const char * str )
void cgit_print_snapshot ( const char * head , const char * hex , const char * prefix ,
const char * filename , int snapshots )
{
const struct snapshot_archive_t * sat ;
static const char * delim = " \t ,:/|; " ;
int f , tl , sl , rv = 0 ;
/* favor legacy setting */
if ( atoi ( str ) )
return 1 ;
for ( ; ; ) {
str + = strspn ( str , delim ) ;
tl = strcspn ( str , delim ) ;
if ( ! tl )
break ;
for ( f = 0 ; f < snapshot_archives_len ; f + + ) {
sat = & snapshot_archives [ f ] ;
sl = strlen ( sat - > suffix ) ;
if ( ( tl = = sl & & ! strncmp ( sat - > suffix , str , tl ) ) | |
( tl = = sl - 1 & & ! strncmp ( sat - > suffix + 1 , str , tl - 1 ) ) ) {
rv | = sat - > bit ;
break ;
}
}
str + = tl ;
const struct cgit_snapshot_format * f ;
int sl , fnl ;
fnl = strlen ( filename ) ;
if ( ! hex )
hex = head ;
for ( f = cgit_snapshot_formats ; f - > suffix ; f + + ) {
if ( ! ( snapshots & f - > bit ) )
continue ;
sl = strlen ( f - > suffix ) ;
if ( fnl < sl | | strcmp ( & filename [ fnl - sl ] , f - > suffix ) )
continue ;
make_snapshot ( f , hex , prefix , filename ) ;
return ;
}
return rv ;
cgit_print_error ( fmt ( " Unsupported snapshot format: %s " , filename ) ) ;
}
/* vim:set sw=8: */