author | Michael Krelin <hacker@klever.net> | 2007-07-21 00:05:34 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2007-07-21 00:05:34 (UTC) |
commit | 18a99bdf879953307d6ae6eb56c2117a4c074b0d (patch) (side-by-side diff) | |
tree | 2d950fec688892398edd232f6e133b97e1a61e51 /ui-snapshot.c | |
parent | 4a92cbb7fd1084764dfe9b97a163f1084c790b15 (diff) | |
download | cgit-18a99bdf879953307d6ae6eb56c2117a4c074b0d.zip cgit-18a99bdf879953307d6ae6eb56c2117a4c074b0d.tar.gz cgit-18a99bdf879953307d6ae6eb56c2117a4c074b0d.tar.bz2 |
introduced .tar.bz2 snapshots
- reworked write_tar_gzip_archive to handle arbitrary filter as a
write_compressed_tar_archive
- reformatted whitespaces in the said function to adhere to common cgit
standards
- added wrappers around write_compressed_tar_archive for .tar.gz and .tar.bz2
- added a hint for vim to use 8 characters shift width by default
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | ui-snapshot.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/ui-snapshot.c b/ui-snapshot.c index 649569f..f623f35 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -1,65 +1,75 @@ /* ui-snapshot.c: generate snapshot of a commit * * Copyright (C) 2006 Lars Hjemli * * Licensed under GNU General Public License v2 * (see COPYING for full license text) */ #include "cgit.h" -static int write_tar_gzip_archive(struct archiver_args *args) +static int write_compressed_tar_archive(struct archiver_args *args,const char *filter) { int rw[2]; pid_t gzpid; int stdout2; int status; int rv; stdout2 = chk_non_negative(dup(STDIN_FILENO), "Preserving STDOUT before compressing"); chk_zero(pipe(rw), "Opening pipe from compressor subprocess"); gzpid = chk_non_negative(fork(), "Forking compressor subprocess"); if(gzpid==0) { /* child */ chk_zero(close(rw[1]), "Closing write end of pipe in child"); chk_zero(close(STDIN_FILENO), "Closing STDIN"); chk_non_negative(dup2(rw[0],STDIN_FILENO), "Redirecting compressor input to stdin"); - execlp("gzip","gzip",NULL); + execlp(filter,filter,NULL); _exit(-1); } /* parent */ chk_zero(close(rw[0]), "Closing read end of pipe"); chk_non_negative(dup2(rw[1],STDOUT_FILENO), "Redirecting output to compressor"); rv = write_tar_archive(args); chk_zero(close(STDOUT_FILENO), "Closing STDOUT redirected to compressor"); chk_non_negative(dup2(stdout2,STDOUT_FILENO), "Restoring uncompressed STDOUT"); chk_zero(close(stdout2), "Closing uncompressed STDOUT"); chk_zero(close(rw[1]), "Closing write end of pipe in parent"); chk_positive(waitpid(gzpid,&status,0), "Waiting on compressor process"); if(! ( WIFEXITED(status) && WEXITSTATUS(status)==0 ) ) cgit_print_error("Failed to compress archive"); return rv; } +static int write_tar_gzip_archive(struct archiver_args *args) +{ + return write_compressed_tar_archive(args,"gzip"); +} +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; } snapshot_archives[] = { { ".zip", "application/x-zip", write_zip_archive }, - { ".tar.gz", "application/x-gzip", write_tar_gzip_archive } + { ".tar.gz", "application/x-tar", write_tar_gzip_archive }, + { ".tar.bz2", "application/x-tar", write_tar_bzip2_archive } }; void cgit_print_snapshot(struct cacheitem *item, const char *hex, const char *prefix, const char *filename) { int fnl = strlen(filename); int f; for(f=0;f<(sizeof(snapshot_archives)/sizeof(*snapshot_archives));++f) { const struct snapshot_archive_t* sat = &snapshot_archives[f]; int sl = strlen(sat->suffix); if(fnl<sl || strcmp(&filename[fnl-sl],sat->suffix)) continue; @@ -93,12 +103,13 @@ void cgit_print_snapshot(struct cacheitem *item, const char *hex, void cgit_print_snapshot_links(const char *repo,const char *hex) { char *filename; int f; for(f=0;f<(sizeof(snapshot_archives)/sizeof(*snapshot_archives));++f) { const struct snapshot_archive_t* sat = &snapshot_archives[f]; filename = fmt("%s-%s%s",repo,hex,sat->suffix); htmlf("<a href='%s'>%s</a><br/>", cgit_pageurl(repo,"snapshot", fmt("id=%s&name=%s",hex,filename)), filename); } } +/* vim:set sw=8: */ |