Add API git_signature_new_now Most tags will have a timestamp of whenever the code is running and dealing with time and timezones is error-prone. Optimize for this case by adding a function which causes the signature to be created with a current timestamp. Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
diff --git a/include/git2/signature.h b/include/git2/signature.h
index b0995c8..013ce74 100644
--- a/include/git2/signature.h
+++ b/include/git2/signature.h
@@ -50,6 +50,17 @@ GIT_BEGIN_DECL
GIT_EXTERN(git_signature *) git_signature_new(const char *name, const char *email, git_time_t time, int offset);
/**
+ * Create a new action signature with a timestamp of 'now'. The
+ * signature must be freed manually or using git_signature_free
+ *
+ * @param name name of the person
+ * @param email email of the person
+ * @return the new sig, NULL on out of memory
+ */
+GIT_EXTERN(git_signature *) git_signature_new_now(const char *name, const char *email);
+
+
+/**
* Create a copy of an existing signature.
*
* All internal strings are also duplicated.
diff --git a/src/signature.c b/src/signature.c
index bd64652..0e83313 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -65,6 +65,25 @@ git_signature *git_signature_dup(const git_signature *sig)
return git_signature_new(sig->name, sig->email, sig->when.time, sig->when.offset);
}
+git_signature *git_signature_new_now(const char *name, const char *email)
+{
+ time_t now;
+ struct tm utc_tm, local_tm;
+ int offset;
+
+ time(&now);
+
+ gmtime_r(&now, &utc_tm);
+ localtime_r(&now, &local_tm);
+
+ offset = mktime(&local_tm) - mktime(&utc_tm);
+ offset /= 60;
+ /* mktime takes care of setting tm_isdst correctly */
+ if (local_tm.tm_isdst)
+ offset += 60;
+
+ return git_signature_new(name, email, now, offset);
+}
static int parse_timezone_offset(const char *buffer, long *offset_out)
{