Improve readability of version string
[TortoiseGit.git] / src / Utils / SmartLibgit2Ref.h
blob1db3ab897c48c6157d18711c58562c0675d8bde9
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2014-2015 - TortoiseGit
4 // based on SmartHandle of TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #pragma once
21 #include "UnicodeUtils.h"
23 /**
24 * \ingroup Utils
25 * Helper classes for libgit2 references.
27 template <typename HandleType, class FreeFunction>
28 class CSmartBuffer
30 public:
31 CSmartBuffer()
33 m_Ref = { 0 };
36 operator HandleType*()
38 return &m_Ref;
41 HandleType* operator->()
43 return &m_Ref;
46 ~CSmartBuffer()
48 FreeFunction::Free(&m_Ref);
51 private:
52 CSmartBuffer(const CSmartBuffer&) = delete;
53 CSmartBuffer& operator=(const CSmartBuffer&) = delete;
55 protected:
56 HandleType m_Ref;
59 struct CFreeBuf
61 static void Free(git_buf* ref)
63 git_buf_free(ref);
67 struct CFreeStrArray
69 static void Free(git_strarray* ref)
71 git_strarray_free(ref);
75 typedef CSmartBuffer<git_buf, CFreeBuf> CAutoBuf;
76 typedef CSmartBuffer<git_strarray, CFreeStrArray> CAutoStrArray;
78 template <typename ReferenceType>
79 class CSmartLibgit2Ref
81 public:
82 CSmartLibgit2Ref()
84 m_Ref = nullptr;
87 void Swap(CSmartLibgit2Ref& tmp)
89 ReferenceType* p;
91 p = m_Ref;
92 m_Ref = tmp.m_Ref;
93 tmp.m_Ref = p;
96 void Free()
98 CleanUp();
101 ReferenceType* Detach()
103 ReferenceType* p = m_Ref;
104 m_Ref = nullptr;
106 return p;
109 operator ReferenceType*() const
111 return m_Ref;
115 * Free the wrapped object and return a pointer to the wrapped object ReferenceType*
117 ReferenceType** GetPointer()
119 CleanUp();
120 return &m_Ref;
123 operator bool() const
125 return IsValid();
128 bool IsValid() const
130 return m_Ref != nullptr;
133 private:
134 CSmartLibgit2Ref(const CSmartLibgit2Ref&) = delete;
135 CSmartLibgit2Ref& operator=(const CSmartLibgit2Ref&) = delete;
137 protected:
138 virtual void FreeRef() = 0;
140 void CleanUp()
142 if (IsValid())
144 FreeRef();
145 m_Ref = nullptr;
149 ReferenceType* m_Ref;
152 class CAutoRepository : public CSmartLibgit2Ref<git_repository>
154 public:
155 CAutoRepository() {};
157 CAutoRepository(git_repository* h)
159 m_Ref = h;
162 CAutoRepository(const CString& gitDir)
164 Open(gitDir);
167 CAutoRepository(const CStringA& gitDirA)
169 Open(gitDirA);
172 CAutoRepository(CAutoRepository&& that)
174 m_Ref = that.Detach();
177 int Open(const CString& gitDir)
179 return Open(CUnicodeUtils::GetUTF8(gitDir));
182 ~CAutoRepository()
184 CleanUp();
187 private:
188 CAutoRepository(const CAutoRepository&) = delete;
189 CAutoRepository& operator=(const CAutoRepository&) = delete;
191 protected:
192 int Open(const CStringA& gitDirA)
194 return git_repository_open(GetPointer(), gitDirA);
197 virtual void FreeRef()
199 git_repository_free(m_Ref);
203 class CAutoSubmodule : public CSmartLibgit2Ref<git_submodule>
205 public:
206 CAutoSubmodule() {};
208 ~CAutoSubmodule()
210 CleanUp();
213 private:
214 CAutoSubmodule(const CAutoSubmodule&) = delete;
215 CAutoSubmodule& operator=(const CAutoSubmodule&) = delete;
217 protected:
218 virtual void FreeRef()
220 git_submodule_free(m_Ref);
224 class CAutoCommit : public CSmartLibgit2Ref<git_commit>
226 public:
227 CAutoCommit() {}
229 CAutoCommit(git_commit* h)
231 m_Ref = h;
234 ~CAutoCommit()
236 CleanUp();
239 private:
240 CAutoCommit(const CAutoCommit&) = delete;
241 CAutoCommit& operator=(const CAutoCommit&) = delete;
243 protected:
244 virtual void FreeRef()
246 git_commit_free(m_Ref);
250 class CAutoTree : public CSmartLibgit2Ref<git_tree>
252 public:
253 CAutoTree() {};
255 git_tree* operator=(git_tree* h)
257 if (m_Ref != h)
259 CleanUp();
260 m_Ref = h;
262 return (*this);
265 ~CAutoTree()
267 CleanUp();
270 private:
271 CAutoTree(const CAutoTree&) = delete;
272 CAutoTree& operator=(const CAutoTree&) = delete;
274 protected:
275 virtual void FreeRef()
277 git_tree_free(m_Ref);
281 class CAutoObject : public CSmartLibgit2Ref<git_object>
283 public:
284 CAutoObject() {};
286 ~CAutoObject()
288 CleanUp();
291 private:
292 CAutoObject(const CAutoObject&) = delete;
293 CAutoObject& operator=(const CAutoObject&) = delete;
295 protected:
296 virtual void FreeRef()
298 git_object_free(m_Ref);
302 class CAutoBlob : public CSmartLibgit2Ref<git_blob>
304 public:
305 CAutoBlob() {};
307 ~CAutoBlob()
309 CleanUp();
312 private:
313 CAutoBlob(const CAutoBlob&) = delete;
314 CAutoBlob& operator=(const CAutoBlob&) = delete;
316 protected:
317 virtual void FreeRef()
319 git_blob_free(m_Ref);
323 class CAutoConfig : public CSmartLibgit2Ref<git_config>
325 public:
326 CAutoConfig() {}
328 CAutoConfig(CAutoRepository &repo)
330 git_repository_config(&m_Ref, repo);
333 CAutoConfig(bool init)
335 if (init)
336 New();
339 void New()
341 CleanUp();
342 git_config_new(&m_Ref);
345 ~CAutoConfig()
347 CleanUp();
350 int GetString(const CString &key, CString &value) const
352 if (!IsValid())
353 return -1;
355 CAutoBuf buf;
356 int ret = 0;
357 if ((ret = git_config_get_string_buf(buf, m_Ref, CUnicodeUtils::GetUTF8(key))))
359 value.Empty();
360 return ret;
363 value = CUnicodeUtils::GetUnicode((CStringA)buf->ptr);
365 return ret;
368 int GetBOOL(const CString &key, BOOL &b) const
370 if (!IsValid())
371 return -1;
373 return git_config_get_bool(&b, m_Ref, CUnicodeUtils::GetUTF8(key));
376 int GetBool(const CString &key, bool &b) const
378 if (!IsValid())
379 return -1;
381 int value = FALSE;
382 int ret = 0;
383 if ((ret = GetBOOL(key, value)) < 0)
384 return ret;
386 b = (value == TRUE);
388 return ret;
391 private:
392 CAutoConfig(const CAutoConfig&) = delete;
393 CAutoConfig& operator=(const CAutoConfig&) = delete;
395 protected:
396 virtual void FreeRef()
398 git_config_free(m_Ref);
402 class CAutoReference : public CSmartLibgit2Ref<git_reference>
404 public:
405 CAutoReference() {}
407 CAutoReference(git_reference* h)
409 m_Ref = h;
412 ~CAutoReference()
414 CleanUp();
417 private:
418 CAutoReference(const CAutoReference&) = delete;
419 CAutoReference& operator=(const CAutoReference&) = delete;
421 protected:
422 virtual void FreeRef()
424 git_reference_free(m_Ref);
428 class CAutoTreeEntry : public CSmartLibgit2Ref<git_tree_entry>
430 public:
431 CAutoTreeEntry() {};
433 ~CAutoTreeEntry()
435 CleanUp();
438 private:
439 CAutoTreeEntry(const CAutoTreeEntry&) = delete;
440 CAutoTreeEntry& operator=(const CAutoTreeEntry&) = delete;
442 protected:
443 virtual void FreeRef()
445 git_tree_entry_free(m_Ref);
449 class CAutoDiff : public CSmartLibgit2Ref<git_diff>
451 public:
452 CAutoDiff() {};
454 ~CAutoDiff()
456 CleanUp();
459 private:
460 CAutoDiff(const CAutoDiff&) = delete;
461 CAutoDiff& operator=(const CAutoDiff&) = delete;
463 protected:
464 virtual void FreeRef()
466 git_diff_free(m_Ref);
470 class CAutoPatch : public CSmartLibgit2Ref<git_patch>
472 public:
473 CAutoPatch() {};
475 ~CAutoPatch()
477 CleanUp();
480 private:
481 CAutoPatch(const CAutoPatch&) = delete;
482 CAutoPatch& operator=(const CAutoPatch&) = delete;
484 protected:
485 virtual void FreeRef()
487 git_patch_free(m_Ref);
491 class CAutoDiffStats : public CSmartLibgit2Ref<git_diff_stats>
493 public:
494 CAutoDiffStats() {};
496 ~CAutoDiffStats()
498 CleanUp();
501 private:
502 CAutoDiffStats(const CAutoDiffStats&) = delete;
503 CAutoDiffStats& operator=(const CAutoDiffStats&) = delete;
505 protected:
506 virtual void FreeRef()
508 git_diff_stats_free(m_Ref);
512 class CAutoIndex : public CSmartLibgit2Ref<git_index>
514 public:
515 CAutoIndex() {};
517 ~CAutoIndex()
519 CleanUp();
522 private:
523 CAutoIndex(const CAutoIndex& that);
524 CAutoIndex& operator=(const CAutoIndex& that);
526 protected:
527 virtual void FreeRef()
529 git_index_free(m_Ref);
533 class CAutoRemote : public CSmartLibgit2Ref<git_remote>
535 public:
536 CAutoRemote() {};
538 ~CAutoRemote()
540 CleanUp();
543 private:
544 CAutoRemote(const CAutoRemote&) = delete;
545 CAutoRemote& operator=(const CAutoRemote&) = delete;
547 protected:
548 virtual void FreeRef()
550 git_remote_free(m_Ref);
554 class CAutoReflog : public CSmartLibgit2Ref<git_reflog>
556 public:
557 CAutoReflog() {};
559 ~CAutoReflog()
561 CleanUp();
564 private:
565 CAutoReflog(const CAutoReflog&) = delete;
566 CAutoReflog& operator=(const CAutoReflog&) = delete;
568 protected:
569 virtual void FreeRef()
571 git_reflog_free(m_Ref);
575 class CAutoRevwalk : public CSmartLibgit2Ref<git_revwalk>
577 public:
578 CAutoRevwalk() {};
580 ~CAutoRevwalk()
582 CleanUp();
585 private:
586 CAutoRevwalk(const CAutoRevwalk&) = delete;
587 CAutoRevwalk& operator=(const CAutoRevwalk&) = delete;
589 protected:
590 virtual void FreeRef()
592 git_revwalk_free(m_Ref);
596 class CAutoBranchIterator : public CSmartLibgit2Ref<git_branch_iterator>
598 public:
599 CAutoBranchIterator() {};
601 ~CAutoBranchIterator()
603 CleanUp();
606 private:
607 CAutoBranchIterator(const CAutoBranchIterator&) = delete;
608 CAutoBranchIterator& operator=(const CAutoBranchIterator&) = delete;
610 protected:
611 virtual void FreeRef()
613 git_branch_iterator_free(m_Ref);
617 class CAutoDescribeResult : public CSmartLibgit2Ref<git_describe_result>
619 public:
620 CAutoDescribeResult() {};
622 ~CAutoDescribeResult()
624 CleanUp();
627 private:
628 CAutoDescribeResult(const CAutoDescribeResult&) = delete;
629 CAutoDescribeResult& operator=(const CAutoDescribeResult&) = delete;
631 protected:
632 virtual void FreeRef()
634 git_describe_result_free(m_Ref);
638 class CAutoStatusList : public CSmartLibgit2Ref<git_status_list>
640 public:
641 CAutoStatusList() {};
643 ~CAutoStatusList()
645 CleanUp();
648 private:
649 CAutoStatusList(const CAutoStatusList&) = delete;
650 CAutoStatusList& operator=(const CAutoStatusList&) = delete;
652 protected:
653 virtual void FreeRef()
655 git_status_list_free(m_Ref);