1 /*
2  * Copyright (C) the libgit2 contributors. All rights reserved.
3  *
4  * This file is part of libgit2, distributed under the GNU GPL v2 with
5  * a Linking Exception. For full terms see the included COPYING file.
6  */
7 module libgit2_d.revparse;
8 
9 
10 private static import libgit2_d.types;
11 
12 /**
13  * @file git2/revparse.h
14  * @brief Git revision parsing routines
15  * @defgroup git_revparse Git revision parsing routines
16  * @ingroup Git
17  * @{
18  */
19 extern (C):
20 nothrow @nogc:
21 public:
22 
23 /**
24  * Find a single object, as specified by a revision string.
25  *
26  * See `man gitrevisions`, or
27  * http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for
28  * information on the syntax accepted.
29  *
30  * The returned object should be released with `git_object_free` when no
31  * longer needed.
32  *
33  * Params:
34  *      out_ = pointer to output object
35  *      repo = the repository to search in
36  *      spec = the textual specification for an object
37  *
38  * Returns: 0 on success, git_error_code.GIT_ENOTFOUND, git_error_code.GIT_EAMBIGUOUS, git_error_code.GIT_EINVALIDSPEC or an error code
39  */
40 //GIT_EXTERN
41 int git_revparse_single(libgit2_d.types.git_object** out_, libgit2_d.types.git_repository* repo, const (char)* spec);
42 
43 /**
44  * Find a single object and intermediate reference by a revision string.
45  *
46  * See `man gitrevisions`, or
47  * http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for
48  * information on the syntax accepted.
49  *
50  * In some cases (`@{<-n>}` or `<branchname>@{upstream}`), the expression may
51  * point to an intermediate reference. When such expressions are being passed
52  * in, `reference_out` will be valued as well.
53  *
54  * The returned object should be released with `git_object_free` and the
55  * returned reference with `git_reference_free` when no longer needed.
56  *
57  * Params:
58  *      object_out = pointer to output object
59  *      reference_out = pointer to output reference or null
60  *      repo = the repository to search in
61  *      spec = the textual specification for an object
62  *
63  * Returns: 0 on success, git_error_code.GIT_ENOTFOUND, git_error_code.GIT_EAMBIGUOUS, git_error_code.GIT_EINVALIDSPEC or an error code
64  */
65 //GIT_EXTERN
66 int git_revparse_ext(libgit2_d.types.git_object** object_out, libgit2_d.types.git_reference** reference_out, libgit2_d.types.git_repository* repo, const (char)* spec);
67 
68 /**
69  * Revparse flags.  These indicate the intended behavior of the spec passed to
70  * git_revparse.
71  */
72 enum git_revparse_mode_t
73 {
74 	/**
75 	 * The spec targeted a single object.
76 	 */
77 	GIT_REVPARSE_SINGLE = 1 << 0,
78 
79 	/**
80 	 * The spec targeted a range of commits.
81 	 */
82 	GIT_REVPARSE_RANGE = 1 << 1,
83 
84 	/**
85 	 * The spec used the '...' operator, which invokes special semantics.
86 	 */
87 	GIT_REVPARSE_MERGE_BASE = 1 << 2,
88 }
89 
90 /**
91  * Git Revision Spec: output of a `git_revparse` operation
92  */
93 struct git_revspec
94 {
95 	/**
96 	 * The left element of the revspec; must be freed by the user
97 	 */
98 	libgit2_d.types.git_object* from;
99 
100 	/**
101 	 * The right element of the revspec; must be freed by the user
102 	 */
103 	libgit2_d.types.git_object* to;
104 
105 	/**
106 	 * The intent of the revspec (i.e. `git_revparse_mode_t` flags)
107 	 */
108 	uint flags;
109 }
110 
111 /**
112  * Parse a revision string for `from`, `to`, and intent.
113  *
114  * See `man gitrevisions` or
115  * http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for
116  * information on the syntax accepted.
117  *
118  * Params:
119  *      revspec = Pointer to an user-allocated git_revspec struct where the result of the rev-parse will be stored
120  *      repo = the repository to search in
121  *      spec = the rev-parse spec to parse
122  *
123  * Returns: 0 on success, GIT_INVALIDSPEC, git_error_code.GIT_ENOTFOUND, git_error_code.GIT_EAMBIGUOUS or an error code
124  */
125 //GIT_EXTERN
126 int git_revparse(.git_revspec* revspec, libgit2_d.types.git_repository* repo, const (char)* spec);
127 
128 /** @} */