1use chrono::prelude::*;
44use color_eyre::eyre::Report;
45use git2::Repository;
46use hex::ToHex;
47
48#[doc(hidden)]
49pub mod clone;
50#[doc(hidden)]
51pub mod info;
52#[doc(hidden)]
53pub mod types;
54
55#[doc(hidden)]
56pub mod repo;
57
58#[doc(inline)]
64pub use crate::types::*;
65
66impl GitCommitMeta {
67 pub fn new<I: ToHex + AsRef<[u8]>>(id: I) -> GitCommitMeta {
70 GitCommitMeta {
71 id: hex::encode(id),
72 message: None,
73 timestamp: None,
74 }
75 }
76
77 pub fn with_timestamp(mut self, time: i64) -> Self {
80 let naive_datetime = NaiveDateTime::from_timestamp(time, 0);
81 let datetime: DateTime<Utc> = DateTime::from_utc(naive_datetime, Utc);
82
83 self.timestamp = Some(datetime);
84 self
85 }
86
87 pub fn with_message(mut self, msg: Option<String>) -> Self {
89 self.message = msg;
90 self
91 }
92}
93
94impl TryFrom<Repository> for GitRepo {
95 type Error = Report;
96
97 fn try_from(repo: Repository) -> Result<Self, Self::Error> {
98 GitRepo::open(repo.path().to_path_buf(), None, None)
99 }
100}
101
102impl From<&GitRepoInfo> for GitRepo {
103 fn from(repo: &GitRepoInfo) -> Self {
105 Self {
106 url: repo.url.clone(),
107 head: repo.head.clone(),
108 credentials: repo.credentials.clone(),
109 branch: repo.branch.clone(),
110 path: repo.path.clone(),
111 }
112 }
113}
114
115impl From<&GitRepoCloneRequest> for GitRepo {
116 fn from(repo: &GitRepoCloneRequest) -> Self {
118 Self {
119 url: repo.url.clone(),
120 head: repo.head.clone(),
121 credentials: repo.credentials.clone(),
122 branch: repo.branch.clone(),
123 path: repo.path.clone(),
124 }
125 }
126}
127
128impl From<GitRepo> for GitRepoCloneRequest {
129 fn from(repo: GitRepo) -> Self {
131 Self {
132 url: repo.url.clone(),
133 head: repo.head.clone(),
134 credentials: repo.credentials.clone(),
135 branch: repo.branch.clone(),
136 path: repo.path,
137 }
138 }
139}
140
141impl From<&GitRepo> for GitRepoCloneRequest {
142 fn from(repo: &GitRepo) -> Self {
144 Self {
145 url: repo.url.clone(),
146 head: repo.head.clone(),
147 credentials: repo.credentials.clone(),
148 branch: repo.branch.clone(),
149 path: repo.path.clone(),
150 }
151 }
152}
153
154impl From<&GitRepo> for GitRepoInfo {
155 fn from(repo: &GitRepo) -> Self {
157 Self {
158 url: repo.url.clone(),
159 head: repo.head.clone(),
160 credentials: repo.credentials.clone(),
161 branch: repo.branch.clone(),
162 path: repo.path.clone(),
163 }
164 }
165}
166impl From<&GitRepoInfo> for GitRepoCloneRequest {
167 fn from(repo: &GitRepoInfo) -> Self {
169 Self {
170 url: repo.url.clone(),
171 head: repo.head.clone(),
172 credentials: repo.credentials.clone(),
173 branch: repo.branch.clone(),
174 path: repo.path.clone(),
175 }
176 }
177}
178
179impl From<&GitRepoCloneRequest> for GitRepoInfo {
180 fn from(repo: &GitRepoCloneRequest) -> Self {
182 Self {
183 url: repo.url.clone(),
184 head: repo.head.clone(),
185 credentials: repo.credentials.clone(),
186 branch: repo.branch.clone(),
187 path: repo.path.clone(),
188 }
189 }
190}