907e51f53079e8d77ae026b7f6dc2e1f25b43608 galt Tue Mar 2 03:57:16 2010 -0800 adding userHash and users list diff --git git-reports.c git-reports.c index 89c2061..f55fcc3 100644 --- git-reports.c +++ git-reports.c @@ -1,185 +1,201 @@ /* git-reports.c for creating git equivalent of cvs-reports. */ #include "common.h" #include "options.h" #include "dystring.h" #include "errabort.h" #include "hash.h" #include "linefile.h" static char const rcsid[] = "$Id: git-reports.c,v 1.1 2010/03/02 08:43:07 galt Exp $"; -//struct hash *cidHash = NULL; + +struct hash *userHash = NULL; +struct slName *users = NULL; char *startTag = NULL; char *endTag = NULL; char *startDate = NULL; char *endDate = NULL; char *title = NULL; char *repoDir = NULL; char *outDir = NULL; char gitCmd[1024]; struct files { char type; char *path; }; struct commit { struct commit *next; char *commitId; char *author; char *date; char *comment; struct files *files; }; void usage(char *msg) /* Explain usage and exit. */ { errAbort( "%s\n\n" "git-reports - produce source code reports useful for code-review on git repository \n" "\n" "Usage:\n" " git-reports startTag endTag startDate endDate title repoDir outDir\n" "where " " startTag and endTag are repository tags marking the beginning and end of the git range\n" " startDate and endDate and title are just strings that get printed on the report\n" " repoDir is where the git repository\n" " outDir is the output directory.\n" " --help - this help screen\n", msg); } static struct optionSpec options[] = { {"-help", OPTION_BOOLEAN}, {NULL, 0}, }; struct commit* getCommits() /* get all commits from startTag to endTag */ { safef(gitCmd,sizeof(gitCmd), "" "GIT_DIR=%s/.git " "git log origin/%s..origin/%s --name-status > commits.tmp" , repoDir, startTag, endTag); system(gitCmd); // TODO error handling struct lineFile *lf = lineFileOpen("commits.tmp", TRUE); int lineSize; char *line; struct commit *commits = NULL, *commit = NULL; struct files *files = NULL, *f = NULL; while (lineFileNext(lf, &line, &lineSize)) { boolean isMerge = FALSE; char *w = nextWord(&line); AllocVar(commit); if (!sameString("commit", w)) errAbort("expected keyword commit parsing commits.tmp\n"); commit->commitId = cloneString(nextWord(&line)); lineFileNext(lf, &line, &lineSize); w = nextWord(&line); if (sameString("Merge:", w)) { isMerge = TRUE; lineFileNext(lf, &line, &lineSize); w = nextWord(&line); } if (!sameString("Author:", w)) errAbort("expected keyword Author: parsing commits.tmp\n"); commit->author = cloneString(nextWord(&line)); lineFileNext(lf, &line, &lineSize); w = nextWord(&line); if (!sameString("Date:", w)) errAbort("expected keyword Date: parsing commits.tmp\n"); commit->date = cloneString(nextWord(&line)); lineFileNext(lf, &line, &lineSize); if (!sameString("", line)) errAbort("expected blank line parsing commits.tmp\n"); /* collect the comment-lines */ struct dyString *dy = NULL; dy = dyStringNew(0); while (lineFileNext(lf, &line, &lineSize)) { if (sameString("", line)) break; w = skipLeadingSpaces(line); dyStringPrintf(dy, "%s\n", w); } commit->comment = cloneString(dy->string); freeDyString(&dy); if (!isMerge) { /* collect the files-list */ while (lineFileNext(lf, &line, &lineSize)) { if (sameString("", line)) break; AllocVar(f); w = nextWord(&line); f->type = w[0]; f->path = cloneString(line); slAddHead(&files, f); } + slReverse(&files); } - commit->files = files; slAddHead(&commits, commit); + slReverse(&commits); } lineFileClose(&lf); unlink("commits.tmp"); return commits; } void gitReports() /* generate code-review reports from git repo */ { -struct commit *commits = getCommits(); +/* read the commits */ +struct commit *commits = getCommits(), *c = NULL; +/* make the user list */ +for(c = commits; c; c = c->next) + { + + if (!hashLookup(userHash, c->author)) + { + hashStore(userHash, c->author); + struct slName *name = newSlName(c->author); + slAddHead(&users, name); + } + } +slReverse(&users); + } int main(int argc, char *argv[]) { optionInit(&argc, argv, options); if (argc != 8) usage("wrong number of args"); if (optionExists("-help")) usage("help"); //if (optionExists("altHeader") && optionExists("autoBoundary")) // altHeader = optionVal("altHeader",altHeader); startTag = argv[1]; endTag = argv[2]; startDate = argv[3]; endDate = argv[4]; title = argv[5]; repoDir = argv[6]; outDir = argv[7]; -gitReports(); - -//cidHash = hashNew(5); +userHash = hashNew(5); +gitReports(); -//hashFree(&cidHash); +hashFree(&userHash); printf("Done.\n"); return 0; }