1 /*
2  *             Copyright Sönke Ludwig 2014.
3  *  Distributed under the Boost Software License, Version 1.0.
4  *     (See accompanying file LICENSE_1_0.txt or copy at
5  *           http://www.boost.org/LICENSE_1_0.txt)
6  */
7 module git.signature;
8 
9 import git.commit;
10 import git.oid;
11 import git.repository;
12 import git.tag;
13 import git.types;
14 import git.util;
15 import git.version_;
16 
17 import deimos.git2.signature;
18 import deimos.git2.types;
19 
20 import std.conv : to;
21 import std.datetime;
22 import std.string : toStringz;
23 
24 static if (targetLibGitVersion >= VersionInfo(0, 20, 0)) {
25 	GitSignature createDefaultSignature(GitRepo repo)
26 	{
27 		git_signature* ret;
28 		require(git_signature_default(&ret, repo.cHandle) == 0);
29 		return GitSignature(ret);
30 	}
31 }
32 
33 GitSignature createSignature(string name, string email, SysTime time)
34 {
35 	git_signature* ret;
36 	auto gittime = toGitTime(time);
37 	require(git_signature_new(&ret, name.toStringz, email.toStringz, gittime.time, gittime.offset) == 0);
38 	return GitSignature(ret);
39 }
40 
41 GitSignature createSignature(string name, string email)
42 {
43 	git_signature* ret;
44 	require(git_signature_now(&ret, name.toStringz, email.toStringz) == 0);
45 	return GitSignature(ret);
46 }
47 
48 struct GitSignature {
49 	package this(git_signature* sig)
50 	{
51 		_commit = GitCommit.init;
52 		_tag = GitTag.init;
53 		_data = Data(sig);
54 	}
55 
56 	package this(GitCommit owner, const(git_signature)* sig)
57 	{
58 		_commit = owner;
59 		_tag = GitTag.init;
60 		_sig = sig;
61 	}
62 
63 	package this(GitTag owner, const(git_signature)* sig)
64 	{
65 		_commit = GitCommit.init;
66 		_tag = owner;
67 		_sig = sig;
68 	}
69 
70 	@property SysTime time() const { return _sig.when.toSysTime(); }
71 	@property string name() const { return _sig.name.to!string; }
72 	@property string email() const { return _sig.email.to!string; }
73 	@property GitSignature dup() { return GitSignature(git_signature_dup(this.cHandle)); }
74 
75 	package const(git_signature)* cHandle() const { return _sig ? _sig : _data._payload; }
76 
77 	mixin RefCountedGitObject!(git_signature, git_signature_free, false);
78 
79 private:
80 	// Reference to the parent commit to keep it alive.
81 	GitCommit _commit;
82 	GitTag _tag;
83 	const(git_signature)* _sig;
84 }