def stage(self, paths): """Stage a set of paths. :param paths: List of paths, relative to the repository path """ from dulwich.index import cleanup_mode index = self.open_index() for path in paths: full_path = os.path.join(self.path, path) blob = Blob() try: st = os.stat(full_path) except OSError: # File no longer exists try: del index[path] except KeyError: pass # Doesn't exist in the index either else: f = open(full_path, 'rb') try: blob.data = f.read() finally: f.close() self.object_store.add_object(blob) # XXX: Cleanup some of the other file properties as well? index[path] = (st.st_ctime, st.st_mtime, st.st_dev, st.st_ino, cleanup_mode(st.st_mode), st.st_uid, st.st_gid, st.st_size, blob.id, 0) index.write()
def stage(self, paths): """Stage a set of paths. :param paths: List of paths, relative to the repository path """ from dulwich.index import cleanup_mode index = self.open_index() for path in paths: full_path = os.path.join(self.path, path) blob = Blob() try: st = os.stat(full_path) except OSError: # File no longer exists try: del index[path] except KeyError: pass # Doesn't exist in the index either else: with open(full_path, 'rb') as f: blob.data = f.read() self.object_store.add_object(blob) # XXX: Cleanup some of the other file properties as well? index[path] = (st.st_ctime, st.st_mtime, st.st_dev, st.st_ino, cleanup_mode(st.st_mode), st.st_uid, st.st_gid, st.st_size, blob.id, 0) index.write()
def stage(self, paths): """Stage a set of paths. :param paths: List of paths, relative to the repository path """ from dulwich.index import cleanup_mode index = self.open_index() for path in paths: blob = Blob() try: st = os.stat(path) except OSError: # File no longer exists del index[path] else: f = open(path, 'rb') try: blob.data = f.read() finally: f.close() self.object_store.add_object(blob) # XXX: Cleanup some of the other file properties as well? index[path] = (st.st_ctime, st.st_mtime, st.st_dev, st.st_ino, cleanup_mode(st.st_mode), st.st_uid, st.st_gid, st.st_size, blob.id, 0) index.write()
def _entry_str(entry, path): # To be encoding-agnostic, ensure that values are bytes, and return # a byte string. assert (isinstance(entry.sha, (str, bytes, bytearray))) assert (isinstance(path, (str, bytes, bytearray))) # this returns a format similar to git ls-files mode = b'%o' % dindex.cleanup_mode(entry.mode) return b"{mode} {sha} 0\t{file}".format(mode=mode, sha=entry.sha, file=path)
def test_submodule(self): self.assertEqual(0o160000, cleanup_mode(0o160744))
def test_dir(self): self.assertEqual(0o040000, cleanup_mode(0o40531))
def test_symlink(self): self.assertEqual(0o120000, cleanup_mode(0o120711))
def test_executable(self): self.assertEqual(0o100755, cleanup_mode(0o100711))
def test_file(self): self.assertEqual(0o100644, cleanup_mode(0o100000))
def __setitem__(self, path, raw): # XXX: I don't have much idea, what I'm doing here and I might # just corrupt your repository... # Mark directory as special (None, None) marker value if raw is None: super(Head, self).__setitem__(path, (None, None)) return # Get old mode or use the default try: mode = super(Head, self).__getitem__(path)[1] except KeyError: mode = 0100644 # Get existing entries for the content tree entries = [(key, sha_mode[0], cleanup_mode(sha_mode[1])) for key, sha_mode in super(Head, self).iteritems() if sha_mode[0] is not None and key is not path] # Get author # TODO: refactor to use plone.api or maybe use product_config from Products.CMFCore.utils import getToolByName portal_members = getToolByName(getSite(), 'portal_membership') member = portal_members.getAuthenticatedMember() author = '{0:s} <{1:s}>'.format( member.getProperty('fullname', '') or member.getId(), member.getProperty('email', '') or '*****@*****.**' ) # Get timezone tz_diff = dateutil.tz.tzlocal().utcoffset(datetime.datetime.now()) # Create commit commit = Commit() commit.author = author commit.committer = commit.author commit.commit_time = int(time.time()) commit.author_time = commit.commit_time commit.commit_timezone = tz_diff.seconds commit.author_timezone = tz_diff.seconds if tz_diff < datetime.timedelta(0): commit._author_timezone_neg_utc = True commit._commit_timezone_neg_utc = True commit.encoding = 'UTF-8' commit.message = 'Update {0:s}'.format(path) commit.parents = [self._head] # Create blob and commit tree blob = Blob.from_string(raw) entries.append((path, blob.id, cleanup_mode(mode))) commit.tree = commit_tree(self._repo.object_store, entries) # Save blob and commit self._repo.object_store.add_object(blob) self._repo.object_store.add_object(commit) def determine_wants(haves): # Set new head for the branch return {self.__name__: commit.id} # Push to remote refs = self.__parent__._client.send_pack( self.__parent__._host_path, determine_wants, self._repo.object_store.generate_pack_contents, progress=logger.info ) # Update heads for ref, sha in refs.items(): if sha in self._repo.object_store: self._repo.refs[ref] = sha # Update "index" super(Head, self).__setitem__(path, (blob.id, mode))
def __setitem__(self, path, raw): # XXX: I don't have much idea, what I'm doing here and I might # just corrupt your repository... # Mark directory as special (None, None) marker value if raw is None: super(Head, self).__setitem__(path, (None, None)) return # Get old mode or use the default try: mode = super(Head, self).__getitem__(path)[1] except KeyError: mode = 0100644 # Get existing entries for the content tree entries = [(key, sha_mode[0], cleanup_mode(sha_mode[1])) for key, sha_mode in super(Head, self).iteritems() if sha_mode[0] is not None and key is not path] # Get author # TODO: refactor to use plone.api or maybe use product_config from Products.CMFCore.utils import getToolByName portal_members = getToolByName(getSite(), 'portal_membership') member = portal_members.getAuthenticatedMember() author = '{0:s} <{1:s}>'.format( member.getProperty('fullname', '') or member.getId(), member.getProperty('email', '') or '*****@*****.**') # Get timezone tz_diff = dateutil.tz.tzlocal().utcoffset(datetime.datetime.now()) # Create commit commit = Commit() commit.author = author commit.committer = commit.author commit.commit_time = int(time.time()) commit.author_time = commit.commit_time commit.commit_timezone = tz_diff.seconds commit.author_timezone = tz_diff.seconds if tz_diff < datetime.timedelta(0): commit._author_timezone_neg_utc = True commit._commit_timezone_neg_utc = True commit.encoding = 'UTF-8' commit.message = 'Update {0:s}'.format(path) commit.parents = [self._head] # Create blob and commit tree blob = Blob.from_string(raw) entries.append((path, blob.id, cleanup_mode(mode))) commit.tree = commit_tree(self._repo.object_store, entries) # Save blob and commit self._repo.object_store.add_object(blob) self._repo.object_store.add_object(commit) def determine_wants(haves): # Set new head for the branch return {self.__name__: commit.id} # Push to remote refs = self.__parent__._client.send_pack( self.__parent__._host_path, determine_wants, self._repo.object_store.generate_pack_contents, progress=logger.info) # Update heads for ref, sha in refs.items(): if sha in self._repo.object_store: self._repo.refs[ref] = sha # Update "index" super(Head, self).__setitem__(path, (blob.id, mode))