Skip to content

Commit

Permalink
Merge branch 'clean_projects'
Browse files Browse the repository at this point in the history
  • Loading branch information
simonwagner committed Feb 25, 2015
2 parents 38b8103 + cec4f7c commit 5e98dde
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
16 changes: 13 additions & 3 deletions src/mergepbx.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ def get_argument_parser():
parser.add_argument("--dump",
help="dump input files to the specified ZIP file(useful for debugging)",
default=None)
parser.add_argument("--clean",
help="remove dangling file references in project files",
action="store_true")

return parser

Expand Down Expand Up @@ -66,19 +69,26 @@ def main():
#if debugging is enabled, install the pdb
#handler and let him handle the exception
install_pdb_exception_handler()
merge_pbx_files(args.base, args.mine, args.theirs, output)
merge_pbx_files(args.base, args.mine, args.theirs, output, clean=args.clean)
else:
#if debugging is not enabled, simply report the exception
try:
merge_pbx_files(args.base, args.mine, args.theirs, output)
merge_pbx_files(args.base, args.mine, args.theirs, output, clean=args.clean)
sys.exit(0)
except Exception as e:
log.write("merging failed: %s\n" % str(e))
sys.exit(1)

def merge_pbx_files(basef, minef, theirsf, mergedf):
def merge_pbx_files(basef, minef, theirsf, mergedf, clean=False):
base, mine, theirs = read_pbxs((basef, minef, theirsf))

if clean:
for name, project in zip((basef, minef, theirsf), (base, mine, theirs)):
files_removed = project.clean_files()
if len(files_removed) > 0:
print "WARNING: %d dangling file references removed from %s" % (len(files_removed), name)


merged_project = merge_pbxs(base, mine, theirs)

pbxproj.write(mergedf, merged_project)
Expand Down
18 changes: 18 additions & 0 deletions src/pbxproj/pbxobjects.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@ def phase_of_object(self, identifier):
def get_encoding(self):
return self._encoding

def clean_files(self):
#remove PBXBuildFile entries that are no longer referenced
files = self._objects.getobjects(isa="PBXBuildFile")
removed_files = []
for (identifier, file) in files:
if not file.fileRef in self._objects:
removed_files.append(identifier)
self._objects.delete(identifier)

return removed_files


class PBXClasses(object):
def __init__(self, data_dict):
self.data_dict = data_dict
Expand All @@ -54,6 +66,12 @@ def keys(self):
def get(self, key):
return self._make_isa_object(key, self.data_dict[key])

def __contains__(self, key):
return key in self.data_dict

def delete(self, key):
del self.data_dict[key]

def iterobjects(self, isa=None):
if self.ignore_unknown_objects:
items_iter = ((key, value) for key,value in self.data_dict.iteritems() if isa.is_known(value["isa"]))
Expand Down

0 comments on commit 5e98dde

Please sign in to comment.