8d69455e88abc5afe067fbf85d7416969a4e5017 galt Tue Mar 2 03:42:49 2010 -0800 add parsing for main commits list from startTag to endTag diff --git git-reports.c git-reports.c index 563f678..89c2061 100644 --- git-reports.c +++ git-reports.c @@ -1,96 +1,185 @@ /* 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 dyString *dy = 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}, }; -void getCommits() +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); + } + } + + + commit->files = files; + + slAddHead(&commits, commit); + } +lineFileClose(&lf); + +unlink("commits.tmp"); +return commits; } void gitReports() /* generate code-review reports from git repo */ { -getCommits(); +struct commit *commits = getCommits(); } 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); -//dy = dyStringNew(0); //hashFree(&cidHash); -//freeDyString(&dy); printf("Done.\n"); return 0; }