def iter_diff_files(self, handle): '''Iterate over null terminated results of git diff-*. Yields status, filename, extra_filename; where status is the status code from git diff-*, filename is the filename, and extra_filename is either None or a filename involved in a rename or copy operation. The command executed should contain -z, as this function assumes null terminated output. ''' segments = iter(NullTerminated(handle)) try: while 1: info = segments.next() # strip colon info = info[1:] info_fields = info.split() status = info_fields[4] file_name = segments.next() if status[0] in 'CR': extra_file_name = segments.next() else: extra_file_name = None yield status, file_name, extra_file_name except StopIteration: pass
def iter_unknown_files(self): '''Run git ls-files -o to find "unknown" files. Yields filename. ''' cmd = 'git ls-files -z -o --directory --exclude-from=%s' \ % self.exclude_file remote_in, remote_out, waiter = self.popen2(cmd) remote_in.close() for filename in NullTerminated(remote_out): yield filename remote_out.close() waiter()
def iter_unknown_files(self): '''Run git ls-files -o to find "unknown" files. Yields filename. ''' cmd = 'git ls-files -z -o --directory --exclude-from=%s' \ % self.global_exclude_file if self.local_exclude_file != "" and os.path.isfile( self.local_exclude_file): cmd += " --exclude-from=%s" % self.local_exclude_file remote_in, remote_out, waiter = self.popen2(cmd) remote_in.close() for filename in NullTerminated(remote_out): yield filename remote_out.close() waiter()
def iter_ls_tree(self, raw_tree, raw_files): '''Run git ls-tree against the given tree. Yields stat, kind, blob_id, filename. File list explodes to all files if empty. ''' if raw_files: files = '--' + self.quote_args(raw_files) else: files = '' tree = mkarg(raw_tree) cmd = 'git ls-tree -r -z %s %s' % (tree, files) remote_in, remote_out, waiter = self.popen2(cmd) remote_in.close() for item in NullTerminated(remote_out): stat, kind, blob_id, filename = item.split(None, 3) yield stat, kind, blob_id, filename waiter()
def iter_ls_files(self, files, modified_flag=False): '''Run git ls-files. Yields filename. If modified_flag is true, only modified files are returned. The modified filter is applied after file list explosion. ''' args = self.quote_args(files) if modified_flag: modified_arg = '-m' else: modified_arg = '' cmd = 'git ls-files -z %s %s' % (modified_arg, args) remote_in, remote_out, waiter = self.popen2(cmd) remote_in.close() for filename in NullTerminated(remote_out): yield filename waiter()
def test_zero_length(self): underlying = 'abc\ndef\0\0fgh\0ijk' handle = stringio(underlying) self.assert_equal(['abc\ndef', '', 'fgh', 'ijk'], list(NullTerminated(handle)))
def test_terminator_at_block_end(self): underlying = 'abc\ndef\0fgh\0ijk' handle = stringio(underlying) self.assert_equal(['abc\ndef', 'fgh', 'ijk'], list(NullTerminated(handle, 8)))
def test_over_block_size(self): underlying = 'abc\ndef\0fgh\0ijk' handle = stringio(underlying) self.assert_equal(['abc\ndef', 'fgh', 'ijk'], list(NullTerminated(handle, 5)))
def test_null_terminated_missing_last(self): underlying = 'abc\ndef\0fgh\0ijk' handle = stringio(underlying) self.assert_equal(['abc\ndef', 'fgh', 'ijk'], list(NullTerminated(handle)))