39
                self.ignored_files = [ '.bzr', '.bzrignore' ]
 
 
42
        def has_authority( self ):
 
 
43
                """Check that the directory is under this VCS's control.
 
 
46
                return os.path.exists( os.path.join( self.dir, '.bzr' ) )
 
 
49
        def expand_repo_url( self, url ):
 
 
50
                """Convert a simple hostname in to an URL that the VCS can use.
 
 
53
                return 'bzr+ssh://%s/%s/%s' % ( url, the.dir, the.repo.name )
 
 
90
105
                output = self.run( [ 'bzr', 'revno', '--tree' ] )
 
93
 
                buf = StringIO.StringIO( output )
 
 
108
                buf = io.StringIO( output )
 
94
109
                return buf.readline().rstrip()
 
 
114
129
                                        raise RunTimeError(
 
115
130
                                                'failed to parse bzr kind change: %s' % file )
 
116
131
                                file = matches.group( 1 )
 
117
 
                                if the.verbose >= 2: print "removing (kind changed): " + file
 
 
132
                                if the.verbose >= 2: print("removing (kind changed): " + file)
 
118
133
                                full_file = os.path.join( self.dir, file )
 
119
134
                                if os.path.isfile( full_file ) or os.path.islink( full_file ):
 
120
135
                                        os.unlink( full_file )
 
 
138
153
                                        raise RunTimeError(
 
139
154
                                                'failed to parse bzr unknowns: %s' % file )
 
140
155
                                file = matches.group( 1 )
 
141
 
                                if the.verbose >= 2: print "removing (unknown): " + file
 
 
156
                                if the.verbose >= 2: print("removing (unknown): " + file)
 
142
157
                                full_file = os.path.join( self.dir, file )
 
143
158
                                if os.path.isfile( full_file ) or os.path.islink( full_file ):
 
144
159
                                        os.unlink( full_file )
 
 
205
220
                # parse output (see logic in report() in bzrlib/delta.py)
 
207
 
                buf = StringIO.StringIO( output )
 
 
222
                buf = io.StringIO( output )
 
209
224
                        if not re.search( '^[-R+ ?][K NMD!][* ] ', line ): continue
 
210
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 )
 
237
265
        def has_changes( self ):
 
238
266
                """Check if the branch has any local modifications.
 
 
275
 
                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 );
 
278
314
        def run( self, cmd ):
 
279
 
                if the.verbose >= 2: print 'exec: %s' % ' '.join( cmd )
 
 
315
                if the.verbose >= 2: print('exec: %s' % ' '.join( cmd ))
 
280
316
                p = Popen( cmd, cwd = self.dir,
 
281
317
                                   stdout = subprocess.PIPE, stderr = subprocess.STDOUT )
 
282
 
                output = p.communicate()[ 0 ]
 
 
318
                output = p.communicate()[ 0 ].decode()
 
283
319
                if p.returncode > 0:
 
284
320
                        raise self.VcsError( ' '.join( cmd[ : 2 ] ), output )
 
285
321
                if the.verbose >= 2:
 
286
 
                        print re.sub( '(^|\n)', '\\1  > ', output.rstrip() )
 
 
322
                        verbose_output = output.rstrip()
 
 
323
                        if len( verbose_output ):
 
 
324
                                print(re.sub( '(^|\n)', '\\1  : ', verbose_output ))
 
290
328
        def parse_file_blocks( self, output ):
 
293
 
                buf = StringIO.StringIO( output )
 
 
331
                buf = io.StringIO( output )
 
295
333
                        matches = re.search( '^([a-z ]+):$', line, re.I )