104
105
                output = self.run( [ 'bzr', 'revno', '--tree' ] )
 
107
 
                buf = StringIO.StringIO( output )
 
 
108
                buf = io.StringIO( output )
 
108
109
                return buf.readline().rstrip()
 
 
128
129
                                        raise RunTimeError(
 
129
130
                                                'failed to parse bzr kind change: %s' % file )
 
130
131
                                file = matches.group( 1 )
 
131
 
                                if the.verbose >= 2: print "removing (kind changed): " + file
 
 
132
                                if the.verbose >= 2: print("removing (kind changed): " + file)
 
132
133
                                full_file = os.path.join( self.dir, file )
 
133
134
                                if os.path.isfile( full_file ) or os.path.islink( full_file ):
 
134
135
                                        os.unlink( full_file )
 
 
152
153
                                        raise RunTimeError(
 
153
154
                                                'failed to parse bzr unknowns: %s' % file )
 
154
155
                                file = matches.group( 1 )
 
155
 
                                if the.verbose >= 2: print "removing (unknown): " + file
 
 
156
                                if the.verbose >= 2: print("removing (unknown): " + file)
 
156
157
                                full_file = os.path.join( self.dir, file )
 
157
158
                                if os.path.isfile( full_file ) or os.path.islink( full_file ):
 
158
159
                                        os.unlink( full_file )
 
 
219
220
                # parse output (see logic in report() in bzrlib/delta.py)
 
221
 
                buf = StringIO.StringIO( output )
 
 
222
                buf = io.StringIO( output )
 
223
224
                        if not re.search( '^[-R+ ?][K NMD!][* ] ', line ): continue
 
224
225
                        line = line.rstrip()
 
 
 
253
                """Get a list of any local modifications.  This method returns a list of files
 
 
259
                output = self.run( [ 'bzr', 'status', '--no-pending' ] )
 
 
262
                return self.parse_file_blocks( output )
 
251
265
        def has_changes( self ):
 
252
266
                """Check if the branch has any local modifications.
 
 
289
 
                self.run( [ 'bzr', 'commit', '-m', '' ] )
 
 
304
                        self.run( [ 'bzr', 'commit', '-m', '' ] )
 
 
305
                except self.VcsError as e:
 
 
306
                        if re.search( 'Working tree is out of date', e.output ):
 
 
307
                                raise the.program.FatalError(
 
 
308
                                        'you must update your files first.\n' +
 
 
309
                                        'Hint: see "%s update --help"' % the.program.name );
 
292
314
        def run( self, cmd ):
 
293
 
                if the.verbose >= 2: print 'exec: %s' % ' '.join( cmd )
 
 
315
                if the.verbose >= 2: print('exec: %s' % ' '.join( cmd ))
 
294
316
                p = Popen( cmd, cwd = self.dir,
 
295
317
                                   stdout = subprocess.PIPE, stderr = subprocess.STDOUT )
 
296
 
                output = p.communicate()[ 0 ]
 
 
318
                output = p.communicate()[ 0 ].decode()
 
297
319
                if p.returncode > 0:
 
298
320
                        raise self.VcsError( ' '.join( cmd[ : 2 ] ), output )
 
299
321
                if the.verbose >= 2:
 
300
322
                        verbose_output = output.rstrip()
 
301
323
                        if len( verbose_output ):
 
302
 
                                print re.sub( '(^|\n)', '\\1  : ', verbose_output )
 
 
324
                                print(re.sub( '(^|\n)', '\\1  : ', verbose_output ))
 
306
328
        def parse_file_blocks( self, output ):
 
309
 
                buf = StringIO.StringIO( output )
 
 
331
                buf = io.StringIO( output )
 
311
333
                        matches = re.search( '^([a-z ]+):$', line, re.I )