/stdhome

To get this branch, use:
bzr branch http://bzr.ed.am/stdhome
5 by Tim Marston
moved copy-in, copy-out and deployment conflict checking to a set of "walkers";
1
# status_walker.py
2
#
3
# Copyright (C) 2013 to 2014 Tim Marston <tim@edm.am>
4
#
5
# This file is part of stdhome (hereafter referred to as "this program").
6
# See http://ed.am/dev/stdhome for more information.
7
#
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
12
#
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
# GNU General Public License for more details.
17
#
18
# You should have received a copy of the GNU General Public License
19
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
21
22
import filecmp
23
from walker import Walker
24
import stdhome.the as the
25
26
27
class StatusWalker( Walker ):
28
	"""The status walker compares all files in the repo with those in the home
29
	directory and notes any that have been modified, are missing, or which have
30
	changed type.  It is run, for example, but the "stdhome status" comand.
31
32
	Walker source:       home dir
33
	Walker destination:  repo
34
	Walker traversing:   repo
35
	"""
36
37
	def __init__( self ):
38
		self.src_dir = the.full_fsdir
39
		self.dst_dir = the.repo.full_dir
40
		self.walk_list = self.generate_walk_list( the.repo.full_dir )
41
42
		self.modified = list()
43
		self.missing = list()
44
		self.changed = list()
45
46
47
	def process( self, rel_file, src_file, src_type, dst_file, dst_type ):
48
49
		# entity is missing in home dir?
50
		if src_type == '_':
51
			self.missing.append( rel_file )
52
53
			# if a directory is missing in the home dir, we only really want to
54
			# hear about that and not all the files it contains (which are also
55
			# obviously missing)
56
			return False
57
58
		# entity has changed type?
59
		elif src_type != dst_type:
60
			self.changed.append( "%s (now %s)" % (
61
				rel_file, self.name_of_type( src_type ) ) )
62
63
			# if an entity has changed to/from a directory, we don't care about
64
			# anything that directory does/did contain
65
			return False
66
67
		# entity has been modified?
68
		# TODO: check directory permission changes
69
		if dst_type == 'f':
70
			if not filecmp.cmp( src_file, dst_file ):
71
				self.modified.append( rel_file )
72
		elif dst_type == 'l':
73
			if os.readlink( src_file ) != os.readlink( dst_file ):
74
				self.modified.append( rel_file )
75
76
		# nothing to see here
77
		return True