summaryrefslogtreecommitdiff
path: root/python/collaboration/folder.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/collaboration/folder.py')
-rw-r--r--python/collaboration/folder.py164
1 files changed, 164 insertions, 0 deletions
diff --git a/python/collaboration/folder.py b/python/collaboration/folder.py
new file mode 100644
index 00000000..cedbbe6d
--- /dev/null
+++ b/python/collaboration/folder.py
@@ -0,0 +1,164 @@
+
+import ctypes
+from typing import Optional
+
+from .. import _binaryninjacore as core
+from .. import project as core_project
+from . import project, remote, util
+
+
+class RemoteFolder:
+ """
+ Class representing a remote folder in a project.
+ """
+ def __init__(self, handle: core.BNRemoteFolderHandle):
+ self._handle = ctypes.cast(handle, core.BNRemoteFolderHandle)
+
+ def __del__(self):
+ if core is not None:
+ core.BNFreeRemoteFolder(self._handle)
+
+ def __eq__(self, other):
+ if not isinstance(other, RemoteFolder):
+ return False
+ return self.id == other.id
+
+ def __repr__(self):
+ path = self.name
+ parent = self.parent
+ while parent is not None:
+ path = parent.name + '/' + path
+ parent = parent.parent
+ return f'<folder: {self.remote.name}/{self.project.name}/{path}>'
+
+ def __str__(self):
+ path = self.name
+ parent = self.parent
+ while parent is not None:
+ path = parent.name + '/' + path
+ parent = parent.parent
+ return f'<folder: {self.remote.name}/{self.project.name}/{path}>'
+
+ @property
+ def core_folder(self) -> 'core_project.ProjectFolder':
+ core_handle = core.BNRemoteFolderGetCoreFolder(self._handle)
+ if core_handle is None:
+ raise RuntimeError(util._last_error())
+ return core_project.ProjectFolder(handle=ctypes.cast(core_handle, ctypes.POINTER(core.BNProjectFolder)))
+
+ @property
+ def project(self) -> 'project.RemoteProject':
+ """
+ Owning Project.
+
+ :return: Project object
+ """
+ value = core.BNRemoteFolderGetProject(self._handle)
+ if value is None:
+ raise RuntimeError(util._last_error())
+ return project.RemoteProject(handle=value)
+
+ @property
+ def remote(self) -> 'remote.Remote':
+ """
+ Owning Remote
+
+ :return: Remote object
+ """
+ value = core.BNRemoteFolderGetRemote(self._handle)
+ if value is None:
+ raise RuntimeError(util._last_error())
+ return remote.Remote(handle=value)
+
+ @property
+ def parent(self) -> Optional['RemoteFolder']:
+ """
+ Parent folder, if one exists. None if this is in the root of a project.
+
+ :return: Parent folder object or None
+ """
+ if not self.project.has_pulled_folders:
+ self.project.pull_folders()
+ parent = ctypes.POINTER(core.BNRemoteFolder)()
+ if not core.BNRemoteFolderGetParent(self._handle, parent):
+ raise RuntimeError(util._last_error())
+ if not parent:
+ return None
+ return RemoteFolder(handle=parent)
+
+ @parent.setter
+ def parent(self, parent: Optional['RemoteFolder']):
+ """
+ Set the parent folder. You will need to push the folder to update the remote version.
+
+ :param parent: New parent folder
+ :raises RuntimeError: If there was an error
+ """
+ if not core.BNRemoteFolderSetParent(self._handle, parent._handle if parent is not None else None):
+ raise RuntimeError(util._last_error())
+
+ @property
+ def url(self) -> str:
+ """
+ Web api endpoint URL
+
+ :return: URL string
+ """
+ return core.BNRemoteFolderGetUrl(self._handle)
+
+ @property
+ def id(self) -> str:
+ """
+ Unique id
+
+ :return: Id string
+ """
+ return core.BNRemoteFolderGetId(self._handle)
+
+ @property
+ def parent_id(self) -> Optional[str]:
+ """
+ Unique id of parent folder, if there is a parent. None, otherwise
+
+ :return: Id string or None
+ """
+ parent_id = ctypes.c_char_p()
+ if not core.BNRemoteFolderGetParentId(self._handle, parent_id):
+ return None
+ return core.pyNativeStr(parent_id.value)
+
+ @property
+ def name(self) -> str:
+ """
+ Displayed name of folder
+
+ :return: Name string
+ """
+ return core.BNRemoteFolderGetName(self._handle)
+
+ @name.setter
+ def name(self, name: str):
+ """
+ Set the display name of the folder. You will need to push the folder to update the remote version.
+
+ :param name: New name
+ """
+ core.BNRemoteFolderSetName(self._handle, name)
+
+ @property
+ def description(self) -> str:
+ """
+ Description of the folder
+
+ :return: Description string
+ """
+ return core.BNRemoteFolderGetDescription(self._handle)
+
+ @description.setter
+ def description(self, description: str):
+ """
+ Set the description of the folder. You will need to push the folder to update the remote version.
+
+ :param description: New description
+ """
+ core.BNRemoteFolderSetDescription(self._handle, description)