#include <pwd.h>
#include <time.h>
-#include <string.h>
#include <ctype.h>
-#include <time.h>
#define BLOCKING (1ul << 14)
* how multi-way merges are represented.
*/
#define MAXPARENT (16)
+static unsigned char parent_sha1[MAXPARENT][20];
+
+static char *commit_tree_usage = "git-commit-tree <sha1> [-p <sha1>]* < changelog";
-static char *commit_tree_usage = "commit-tree <sha1> [-p <sha1>]* < changelog";
+static int new_parent(int idx)
+{
+ int i;
+ unsigned char *sha1 = parent_sha1[idx];
+ for (i = 0; i < idx; i++) {
+ if (!memcmp(parent_sha1[i], sha1, 20)) {
+ error("duplicate parent %s ignored", sha1_to_hex(sha1));
+ return 0;
+ }
+ }
+ return 1;
+}
int main(int argc, char **argv)
{
int i, len;
int parents = 0;
unsigned char tree_sha1[20];
- unsigned char parent_sha1[MAXPARENT][20];
unsigned char commit_sha1[20];
char *gecos, *realgecos, *commitgecos;
char *email, *commitemail, realemail[1000];
- char date[20], realdate[20];
- char *audate;
+ char date[50], realdate[50];
+ char *audate, *cmdate;
char comment[1000];
struct passwd *pw;
char *buffer;
if (!b || strcmp(a, "-p") || get_sha1(b, parent_sha1[parents]))
usage(commit_tree_usage);
check_valid(parent_sha1[parents], "commit");
- parents++;
+ if (new_parent(parents))
+ parents++;
}
if (!parents)
fprintf(stderr, "Committing initial tree %s\n", argv[1]);
datestamp(realdate, sizeof(realdate));
strcpy(date, realdate);
- commitgecos = getenv("COMMIT_AUTHOR_NAME") ? : realgecos;
- commitemail = getenv("COMMIT_AUTHOR_EMAIL") ? : realemail;
- gecos = getenv("AUTHOR_NAME") ? : realgecos;
- email = getenv("AUTHOR_EMAIL") ? : realemail;
- audate = getenv("AUTHOR_DATE");
+ commitgecos = gitenv("GIT_COMMITTER_NAME") ? : realgecos;
+ commitemail = gitenv("GIT_COMMITTER_EMAIL") ? : realemail;
+ gecos = gitenv("GIT_AUTHOR_NAME") ? : realgecos;
+ email = gitenv("GIT_AUTHOR_EMAIL") ? : realemail;
+ audate = gitenv("GIT_AUTHOR_DATE");
if (audate)
parse_date(audate, date, sizeof(date));
+ cmdate = gitenv("GIT_COMMITTER_DATE");
+ if (cmdate)
+ parse_date(cmdate, realdate, sizeof(realdate));
remove_special(gecos); remove_special(realgecos); remove_special(commitgecos);
remove_special(email); remove_special(realemail); remove_special(commitemail);