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.
21 #include "UnicodeUtils.h"
25 * Helper classes for libgit2 references.
27 template <typename HandleType
, class FreeFunction
>
36 operator HandleType
*()
41 HandleType
* operator->()
48 FreeFunction::Free(&m_Ref
);
52 CSmartBuffer(const CSmartBuffer
&) = delete;
53 CSmartBuffer
& operator=(const CSmartBuffer
&) = delete;
61 static void Free(git_buf
* ref
)
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
87 void Swap(CSmartLibgit2Ref
& tmp
)
101 ReferenceType
* Detach()
103 ReferenceType
* p
= m_Ref
;
109 operator ReferenceType
*() const
115 * Free the wrapped object and return a pointer to the wrapped object ReferenceType*
117 ReferenceType
** GetPointer()
123 operator bool() const
130 return m_Ref
!= nullptr;
134 CSmartLibgit2Ref(const CSmartLibgit2Ref
&) = delete;
135 CSmartLibgit2Ref
& operator=(const CSmartLibgit2Ref
&) = delete;
138 virtual void FreeRef() = 0;
149 ReferenceType
* m_Ref
;
152 class CAutoRepository
: public CSmartLibgit2Ref
<git_repository
>
155 CAutoRepository() {};
157 CAutoRepository(git_repository
* h
)
162 CAutoRepository(const CString
& gitDir
)
167 CAutoRepository(const CStringA
& gitDirA
)
172 CAutoRepository(CAutoRepository
&& that
)
174 m_Ref
= that
.Detach();
177 int Open(const CString
& gitDir
)
179 return Open(CUnicodeUtils::GetUTF8(gitDir
));
188 CAutoRepository(const CAutoRepository
&) = delete;
189 CAutoRepository
& operator=(const CAutoRepository
&) = delete;
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
>
214 CAutoSubmodule(const CAutoSubmodule
&) = delete;
215 CAutoSubmodule
& operator=(const CAutoSubmodule
&) = delete;
218 virtual void FreeRef()
220 git_submodule_free(m_Ref
);
224 class CAutoCommit
: public CSmartLibgit2Ref
<git_commit
>
229 CAutoCommit(git_commit
* h
)
240 CAutoCommit(const CAutoCommit
&) = delete;
241 CAutoCommit
& operator=(const CAutoCommit
&) = delete;
244 virtual void FreeRef()
246 git_commit_free(m_Ref
);
250 class CAutoTree
: public CSmartLibgit2Ref
<git_tree
>
255 git_tree
* operator=(git_tree
* h
)
271 CAutoTree(const CAutoTree
&) = delete;
272 CAutoTree
& operator=(const CAutoTree
&) = delete;
275 virtual void FreeRef()
277 git_tree_free(m_Ref
);
281 class CAutoObject
: public CSmartLibgit2Ref
<git_object
>
292 CAutoObject(const CAutoObject
&) = delete;
293 CAutoObject
& operator=(const CAutoObject
&) = delete;
296 virtual void FreeRef()
298 git_object_free(m_Ref
);
302 class CAutoBlob
: public CSmartLibgit2Ref
<git_blob
>
313 CAutoBlob(const CAutoBlob
&) = delete;
314 CAutoBlob
& operator=(const CAutoBlob
&) = delete;
317 virtual void FreeRef()
319 git_blob_free(m_Ref
);
323 class CAutoConfig
: public CSmartLibgit2Ref
<git_config
>
328 CAutoConfig(CAutoRepository
&repo
)
330 git_repository_config(&m_Ref
, repo
);
333 CAutoConfig(bool init
)
342 git_config_new(&m_Ref
);
350 int GetString(const CString
&key
, CString
&value
) const
357 if ((ret
= git_config_get_string_buf(buf
, m_Ref
, CUnicodeUtils::GetUTF8(key
))))
363 value
= CUnicodeUtils::GetUnicode((CStringA
)buf
->ptr
);
368 int GetBOOL(const CString
&key
, BOOL
&b
) const
373 return git_config_get_bool(&b
, m_Ref
, CUnicodeUtils::GetUTF8(key
));
376 int GetBool(const CString
&key
, bool &b
) const
383 if ((ret
= GetBOOL(key
, value
)) < 0)
392 CAutoConfig(const CAutoConfig
&) = delete;
393 CAutoConfig
& operator=(const CAutoConfig
&) = delete;
396 virtual void FreeRef()
398 git_config_free(m_Ref
);
402 class CAutoReference
: public CSmartLibgit2Ref
<git_reference
>
407 CAutoReference(git_reference
* h
)
418 CAutoReference(const CAutoReference
&) = delete;
419 CAutoReference
& operator=(const CAutoReference
&) = delete;
422 virtual void FreeRef()
424 git_reference_free(m_Ref
);
428 class CAutoTreeEntry
: public CSmartLibgit2Ref
<git_tree_entry
>
439 CAutoTreeEntry(const CAutoTreeEntry
&) = delete;
440 CAutoTreeEntry
& operator=(const CAutoTreeEntry
&) = delete;
443 virtual void FreeRef()
445 git_tree_entry_free(m_Ref
);
449 class CAutoDiff
: public CSmartLibgit2Ref
<git_diff
>
460 CAutoDiff(const CAutoDiff
&) = delete;
461 CAutoDiff
& operator=(const CAutoDiff
&) = delete;
464 virtual void FreeRef()
466 git_diff_free(m_Ref
);
470 class CAutoPatch
: public CSmartLibgit2Ref
<git_patch
>
481 CAutoPatch(const CAutoPatch
&) = delete;
482 CAutoPatch
& operator=(const CAutoPatch
&) = delete;
485 virtual void FreeRef()
487 git_patch_free(m_Ref
);
491 class CAutoDiffStats
: public CSmartLibgit2Ref
<git_diff_stats
>
502 CAutoDiffStats(const CAutoDiffStats
&) = delete;
503 CAutoDiffStats
& operator=(const CAutoDiffStats
&) = delete;
506 virtual void FreeRef()
508 git_diff_stats_free(m_Ref
);
512 class CAutoIndex
: public CSmartLibgit2Ref
<git_index
>
523 CAutoIndex(const CAutoIndex
& that
);
524 CAutoIndex
& operator=(const CAutoIndex
& that
);
527 virtual void FreeRef()
529 git_index_free(m_Ref
);
533 class CAutoRemote
: public CSmartLibgit2Ref
<git_remote
>
544 CAutoRemote(const CAutoRemote
&) = delete;
545 CAutoRemote
& operator=(const CAutoRemote
&) = delete;
548 virtual void FreeRef()
550 git_remote_free(m_Ref
);
554 class CAutoReflog
: public CSmartLibgit2Ref
<git_reflog
>
565 CAutoReflog(const CAutoReflog
&) = delete;
566 CAutoReflog
& operator=(const CAutoReflog
&) = delete;
569 virtual void FreeRef()
571 git_reflog_free(m_Ref
);
575 class CAutoRevwalk
: public CSmartLibgit2Ref
<git_revwalk
>
586 CAutoRevwalk(const CAutoRevwalk
&) = delete;
587 CAutoRevwalk
& operator=(const CAutoRevwalk
&) = delete;
590 virtual void FreeRef()
592 git_revwalk_free(m_Ref
);
596 class CAutoBranchIterator
: public CSmartLibgit2Ref
<git_branch_iterator
>
599 CAutoBranchIterator() {};
601 ~CAutoBranchIterator()
607 CAutoBranchIterator(const CAutoBranchIterator
&) = delete;
608 CAutoBranchIterator
& operator=(const CAutoBranchIterator
&) = delete;
611 virtual void FreeRef()
613 git_branch_iterator_free(m_Ref
);
617 class CAutoDescribeResult
: public CSmartLibgit2Ref
<git_describe_result
>
620 CAutoDescribeResult() {};
622 ~CAutoDescribeResult()
628 CAutoDescribeResult(const CAutoDescribeResult
&) = delete;
629 CAutoDescribeResult
& operator=(const CAutoDescribeResult
&) = delete;
632 virtual void FreeRef()
634 git_describe_result_free(m_Ref
);
638 class CAutoStatusList
: public CSmartLibgit2Ref
<git_status_list
>
641 CAutoStatusList() {};
649 CAutoStatusList(const CAutoStatusList
&) = delete;
650 CAutoStatusList
& operator=(const CAutoStatusList
&) = delete;
653 virtual void FreeRef()
655 git_status_list_free(m_Ref
);