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.revwalk;
8 
9 import git.commit;
10 import git.oid;
11 import git.repository;
12 import git.types;
13 import git.util;
14 import git.version_;
15 
16 import deimos.git2.errors;
17 import deimos.git2.revwalk;
18 import deimos.git2.types;
19 
20 import std.conv : to;
21 import std.string : toStringz;
22 
23 // TODO: range interface?
24 
25 
26 GitRevWalk createRevWalk(GitRepo repo)
27 {
28 	git_revwalk* ret;
29 	require(git_revwalk_new(&ret, repo.cHandle) == 0);
30 	return GitRevWalk(repo, ret);
31 }
32 
33 enum GitSortFlags {
34 	none = GIT_SORT_NONE,
35 	topological = GIT_SORT_TOPOLOGICAL,
36 	time = GIT_SORT_TIME,
37 	reverse = GIT_SORT_REVERSE
38 }
39 
40 struct GitRevWalk {
41 	package this(GitRepo repo, git_revwalk* revwalk)
42 	{
43 		_repo = repo;
44 		_data = Data(revwalk);
45 	}
46 
47 	@property void sortMode(GitSortFlags mode) { git_revwalk_sorting(this.cHandle, mode); }
48 	@property inout(GitRepo) repository() inout { return _repo; }
49 
50 	void push(GitOid oid) { require(git_revwalk_push(this.cHandle, &oid._get_oid()) == 0); }
51 	void pushGlob(string glob) { require(git_revwalk_push_glob(this.cHandle, glob.toStringz) == 0); }
52 	void pushHead() { require(git_revwalk_push_head(this.cHandle) == 0); }
53 	void pushRef(string refname) { require(git_revwalk_push_ref(this.cHandle, refname.toStringz) == 0); }
54 	void pushRange(string range) { require(git_revwalk_push_range(this.cHandle, range.toStringz) == 0); }
55 
56 	void hide(GitOid commit_id) { require(git_revwalk_hide(this.cHandle, &commit_id._get_oid()) == 0); }
57 	void hideGlob(string glob) { require(git_revwalk_hide_glob(this.cHandle, glob.toStringz) == 0); }
58 	void hideHead() { require(git_revwalk_hide_head(this.cHandle) == 0); }
59 	void hideRef(string refname) { require(git_revwalk_hide_ref(this.cHandle, refname.toStringz) == 0); }
60 
61 	void reset() { git_revwalk_reset(this.cHandle); }
62 
63 	static if (targetLibGitVersion >= VersionInfo(0, 20, 0))
64 		void simplifyFirstParent() { git_revwalk_simplify_first_parent(this.cHandle); }
65 
66 	bool getNext(ref GitOid dst)
67 	{
68 		auto ret = git_revwalk_next(&dst._get_oid(), this.cHandle);
69 		if (ret == GIT_ITEROVER) return false;
70 		require(ret == 0);
71 		return true;
72 	}
73 	
74 
75 	mixin RefCountedGitObject!(git_revwalk, git_revwalk_free);
76 	private GitRepo _repo;
77 }