Update editorconfig
[TortoiseGit.git] / src / Utils / SmartLibgit2Ref.h
blobfbb7a344ad8f23d5dad71a87bbd9b79df25915a1
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2014-2016 - 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 CAutoTag : public CSmartLibgit2Ref<git_tag>
430 public:
431 CAutoTag() {}
433 CAutoTag(git_tag* h)
435 m_Ref = h;
438 ~CAutoTag()
440 CleanUp();
443 private:
444 CAutoTag(const CAutoTag&) = delete;
445 CAutoTag& operator=(const CAutoTag&) = delete;
447 protected:
448 virtual void FreeRef()
450 git_tag_free(m_Ref);
454 class CAutoTreeEntry : public CSmartLibgit2Ref<git_tree_entry>
456 public:
457 CAutoTreeEntry() {};
459 ~CAutoTreeEntry()
461 CleanUp();
464 private:
465 CAutoTreeEntry(const CAutoTreeEntry&) = delete;
466 CAutoTreeEntry& operator=(const CAutoTreeEntry&) = delete;
468 protected:
469 virtual void FreeRef()
471 git_tree_entry_free(m_Ref);
475 class CAutoDiff : public CSmartLibgit2Ref<git_diff>
477 public:
478 CAutoDiff() {};
480 ~CAutoDiff()
482 CleanUp();
485 private:
486 CAutoDiff(const CAutoDiff&) = delete;
487 CAutoDiff& operator=(const CAutoDiff&) = delete;
489 protected:
490 virtual void FreeRef()
492 git_diff_free(m_Ref);
496 class CAutoPatch : public CSmartLibgit2Ref<git_patch>
498 public:
499 CAutoPatch() {};
501 ~CAutoPatch()
503 CleanUp();
506 private:
507 CAutoPatch(const CAutoPatch&) = delete;
508 CAutoPatch& operator=(const CAutoPatch&) = delete;
510 protected:
511 virtual void FreeRef()
513 git_patch_free(m_Ref);
517 class CAutoDiffStats : public CSmartLibgit2Ref<git_diff_stats>
519 public:
520 CAutoDiffStats() {};
522 ~CAutoDiffStats()
524 CleanUp();
527 private:
528 CAutoDiffStats(const CAutoDiffStats&) = delete;
529 CAutoDiffStats& operator=(const CAutoDiffStats&) = delete;
531 protected:
532 virtual void FreeRef()
534 git_diff_stats_free(m_Ref);
538 class CAutoIndex : public CSmartLibgit2Ref<git_index>
540 public:
541 CAutoIndex() {};
543 ~CAutoIndex()
545 CleanUp();
548 private:
549 CAutoIndex(const CAutoIndex& that);
550 CAutoIndex& operator=(const CAutoIndex& that);
552 protected:
553 virtual void FreeRef()
555 git_index_free(m_Ref);
559 class CAutoRemote : public CSmartLibgit2Ref<git_remote>
561 public:
562 CAutoRemote() {};
564 ~CAutoRemote()
566 CleanUp();
569 private:
570 CAutoRemote(const CAutoRemote&) = delete;
571 CAutoRemote& operator=(const CAutoRemote&) = delete;
573 protected:
574 virtual void FreeRef()
576 git_remote_free(m_Ref);
580 class CAutoReflog : public CSmartLibgit2Ref<git_reflog>
582 public:
583 CAutoReflog() {};
585 ~CAutoReflog()
587 CleanUp();
590 private:
591 CAutoReflog(const CAutoReflog&) = delete;
592 CAutoReflog& operator=(const CAutoReflog&) = delete;
594 protected:
595 virtual void FreeRef()
597 git_reflog_free(m_Ref);
601 class CAutoRevwalk : public CSmartLibgit2Ref<git_revwalk>
603 public:
604 CAutoRevwalk() {};
606 ~CAutoRevwalk()
608 CleanUp();
611 private:
612 CAutoRevwalk(const CAutoRevwalk&) = delete;
613 CAutoRevwalk& operator=(const CAutoRevwalk&) = delete;
615 protected:
616 virtual void FreeRef()
618 git_revwalk_free(m_Ref);
622 class CAutoBranchIterator : public CSmartLibgit2Ref<git_branch_iterator>
624 public:
625 CAutoBranchIterator() {};
627 ~CAutoBranchIterator()
629 CleanUp();
632 private:
633 CAutoBranchIterator(const CAutoBranchIterator&) = delete;
634 CAutoBranchIterator& operator=(const CAutoBranchIterator&) = delete;
636 protected:
637 virtual void FreeRef()
639 git_branch_iterator_free(m_Ref);
643 class CAutoReferenceIterator : public CSmartLibgit2Ref<git_reference_iterator>
645 public:
646 CAutoReferenceIterator() {};
648 ~CAutoReferenceIterator()
650 CleanUp();
653 private:
654 CAutoReferenceIterator(const CAutoReferenceIterator&) = delete;
655 CAutoReferenceIterator& operator=(const CAutoReferenceIterator&) = delete;
657 protected:
658 virtual void FreeRef()
660 git_reference_iterator_free(m_Ref);
664 class CAutoDescribeResult : public CSmartLibgit2Ref<git_describe_result>
666 public:
667 CAutoDescribeResult() {};
669 ~CAutoDescribeResult()
671 CleanUp();
674 private:
675 CAutoDescribeResult(const CAutoDescribeResult&) = delete;
676 CAutoDescribeResult& operator=(const CAutoDescribeResult&) = delete;
678 protected:
679 virtual void FreeRef()
681 git_describe_result_free(m_Ref);
685 class CAutoStatusList : public CSmartLibgit2Ref<git_status_list>
687 public:
688 CAutoStatusList() {};
690 ~CAutoStatusList()
692 CleanUp();
695 private:
696 CAutoStatusList(const CAutoStatusList&) = delete;
697 CAutoStatusList& operator=(const CAutoStatusList&) = delete;
699 protected:
700 virtual void FreeRef()
702 git_status_list_free(m_Ref);