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 }