diff options
author | 2007-09-13 13:10:57 +0000 | |
---|---|---|
committer | 2007-09-13 13:10:57 +0000 | |
commit | 5e4c4390536f58dcded3f49eaebcef109a56b96e (patch) | |
tree | 3bca93418c668c87737e2ec0bdedaf5147a0a0c5 /usr.bin/cvs/annotate.c | |
parent | Ops, remove temporary debug line. (diff) | |
download | wireguard-openbsd-5e4c4390536f58dcded3f49eaebcef109a56b96e.tar.xz wireguard-openbsd-5e4c4390536f58dcded3f49eaebcef109a56b96e.zip |
Added annotate support for local and remote repositories. Behaves like
GNU cvs but is a little faster.
OK joris@, ray@, xsa@
Diffstat (limited to 'usr.bin/cvs/annotate.c')
-rw-r--r-- | usr.bin/cvs/annotate.c | 70 |
1 files changed, 64 insertions, 6 deletions
diff --git a/usr.bin/cvs/annotate.c b/usr.bin/cvs/annotate.c index df80a3f1da6..b112211c596 100644 --- a/usr.bin/cvs/annotate.c +++ b/usr.bin/cvs/annotate.c @@ -1,6 +1,7 @@ -/* $OpenBSD: annotate.c,v 1.37 2007/02/22 06:42:09 otto Exp $ */ +/* $OpenBSD: annotate.c,v 1.38 2007/09/13 13:10:57 tobias Exp $ */ /* * Copyright (c) 2006 Xavier Santolaria <xsa@openbsd.org> + * Copyright (c) 2007 Tobias Stoeckmann <tobias@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -17,6 +18,10 @@ #include <sys/param.h> #include <sys/dirent.h> + +#include <stdlib.h> +#include <string.h> +#include <time.h> #include <unistd.h> #include "cvs.h" @@ -108,15 +113,68 @@ cvs_annotate(int argc, char **argv) void cvs_annotate_local(struct cvs_file *cf) { + int i; + char date[10], rnum[13], *p; + RCSNUM *crev; + struct cvs_line **alines; + cvs_log(LP_TRACE, "cvs_annotate_local(%s)", cf->file_path); cvs_file_classify(cf, NULL); - if (cf->file_status == FILE_UNKNOWN || - cf->file_status == FILE_UNLINK) + if (cf->file_status == FILE_UNKNOWN || cf->file_status == FILE_UNLINK || + cf->file_type != CVS_FILE) return; - cvs_printf("Annotations for %s", cf->file_name); - cvs_printf("\n***************\n"); - cvs_printf("no code yet\n"); + if (rev == NULL) + rcs_rev_getlines(cf->file_rcs, cf->file_rcsrev, &alines); + else { + crev = rcsnum_parse(rev); + + if (rcsnum_cmp(crev, cf->file_rcsrev, 0) < 0) { + if (!force_head) { + /* Stick at weird GNU cvs, ignore error. */ + rcsnum_free(crev); + return; + } + rcsnum_cpy(cf->file_rcsrev, crev, 0); + } + rcs_rev_getlines(cf->file_rcs, crev, &alines); + rcsnum_free(crev); + } + + /* Stick at weird GNU cvs, ignore error. */ + if (alines == NULL) + return; + + cvs_log(LP_RCS, "Annotations for %s", cf->file_path); + cvs_log(LP_RCS, "***************"); + + for (i = 0; alines[i] != NULL; i++) { + rcsnum_tostr(alines[i]->l_delta->rd_num, rnum, sizeof(rnum)); + strftime(date, sizeof(date), "%d-%b-%y", + &(alines[i]->l_delta->rd_date)); + if (alines[i]->l_len && + alines[i]->l_line[alines[i]->l_len - 1] == '\n') + alines[i]->l_line[alines[i]->l_len - 1] = '\0'; + else { + p = xmalloc(alines[i]->l_len + 1); + memcpy(p, alines[i]->l_line, alines[i]->l_len); + p[alines[i]->l_len] = '\0'; + + if (alines[i]->l_needsfree) + xfree(alines[i]->l_line); + alines[i]->l_line = p; + alines[i]->l_len++; + alines[i]->l_needsfree = 1; + } + cvs_printf("%-12.12s (%-8.8s %s): %s\n", rnum, + alines[i]->l_delta->rd_author, date, alines[i]->l_line); + + if (alines[i]->l_needsfree) + xfree(alines[i]->l_line); + xfree(alines[i]); + } + + xfree(alines); } |