A converter of the Xcode project file to make merging it much easier in VCS
Project description
xUnique, is a pure Python script to regenerate project.pbxproj, a.k.a the Xcode project file, and make it unique and same on any machine.
As you may know, the UUID generated by Xcode (a.k.a rfc4122) in the file is not unique for the same added file( or other entries like groups,build phases,etc.) on different machines, which makes it a developer’s nightmare to merge and resolve conflicts in project.pbxproj.
xUnique convert all the 96bits UUID(24 alphanumeric chars) to MD5 hex digest(32 hex chars), and Xcode do recognize these MD5 digests.
What it does & How it works
convert project.pbxproj to JSON format
Iterate all objects in JSON and give every UUID an absolute path, and create a new UUID using MD5 hex digest of the path
All elements in this json object is actually connected as a tree
We give a path attribute to every node of the tree using its unique attribute; this path is the absolute path to the root node,
Apply MD5 hex digest to the path for the node
Replace all old UUIDs with the MD5 hex digest and also remove unused UUIDs that are not in the current node tree and UUIDs in wrong format
Sort the project file inlcuding children, files, PBXFileReference and PBXBuildFile list and remove all duplicated entries in these lists
see sort_pbxproj method in xUnique.py if you want to know the implementation;
It’s ported from my modified sort-Xcode-project-file, with some differences in ordering PBXFileReference and PBXBuildFile
With different options, you can use xUnique with more flexibility
Change Log
The change log contains the list of changes and latest version information of each version. Please download Latest Release for production environment usage.
Installation
install from PyPi:
$ pip install xUnique
install locally:
$ python setup.py install
It will install a command line script xunique in dir /usr/local/bin (make sure you have added this dir to your $PATH ). So you can invoke xUnique directly from command line:
$ xunique -h
How to use
There are many ways to use this script after you installed xUnique . I will introduce two:
Xcode “build post-action” (Recommended)
open Edit Scheme in Xcode (shortcut: ⌘+Shift+,)
choose the scheme you use to run your project
expand Build, select Post-actions
click symbol + on the left bottom corner of the right pane
choose New Run Script Action
choose your selected scheme name in Provide build settings from
input commands below:
$ xunique "${PROJECT_FILE_PATH}/project.pbxproj"
click Close and it’s all done.
Next time when you Build or Run the project, xUnique would be triggered after build success. If the build works, you could commit all files.
Demo gif animation is here
Git hook
create a git hook in Terminal like:
$ { echo '#!/bin/sh'; echo 'xunique path/to/MyProject.xcodeproj'; } > .git/hooks/pre-commit
Add permission chmod 755 .git/hooks/pre-commit
xUnique will be triggered when you trying to commit:
Using option -c in command would fail the commit operation if project file is modified. Then you can add the modified project file and commit all the files again.
Option -c is not activated by default. The commit operation will proceed successfully even if the project file is modified by xUnique. So do not push the commit unless you add the modified project file again and do another commit.
CocoaPods users
If your project uses CocoaPods AND added Pods directory to source control, you may also need to uniquify Pods.xcodeproj:
Xcode “build post-action” : add extra command below
$ xunique "${PODS_ROOT}/Pods.xcodeproj"
Git hook: add one more command in hook script
$ { echo '#!/bin/sh'; echo 'xunique path/to/MyProject.xcodeproj'; echo 'xunique path/to/Pods.xcodeproj'; } > .git/hooks/pre-commit
Supported argument options
Use options in xUnique:
$ xunique [options] "path_to/YourProject.xcodeproj/or_project.pbxproj"
- -v
print verbose output, and generate debug_result.json file for debug.
- -u
uniquify project file, that is, replace UUID to MD5 digest.
- -s
sort project file including children, files, PBXFileReference and PBXBuildFile list and remove all duplicated entries in these lists. Supports both original and uniquified project file.
- -p
sort PBXFileReference and PBXBuildFile sections in project file ordered by file names. Only works with -s. Before v4.0.0, this was hard-coded in -s option and cannot be turned off. Starting from v4.0.0, without this option along with -s, xUnique will sort these two types by MD5 digests, the same as Xcode does.
- -c
When project file was modified, xUnique quit with non-zero status. Without this option, the status code would be zero if so. This option is usually used in Git hook to submit xUnique result combined with your original new commit.
Note: If neither -u nor -s exists, -u -s will be appended to existing option list.
Examples
APNS Pusher is a Xcode project which contains a subproject named “Fragaria” as git submodule. Use xUnique to convert it. You can clone my forked repo and try to open and build it in Xcode. You will find that xUnique does not affect the project at all.
The initial diff result could be found here.
The diff result with my modified sort-Xcode-project-file with PBXBuildFile and PBXFileReference sort support could be found here.
Pure python sort result could be found here
PBX sections sorted by MD5 digest result (default in v4.0.0) could be found below
add xUnique to Xcode post action
NOTICE
All project members must add the build post-action or git hook. Thus the project file would be consistent in the repository.
Tested supported isa types:
PBXProject
XCConfigurationList
PBXNativeTarget
PBXTargetDependency
PBXContainerItemProxy
XCBuildConfiguration
PBXSourcesBuildPhase
PBXFrameworksBuildPhase
PBXResourcesBuildPhase
PBXFrameworksBuildPhase
PBXCopyFilesBuildPhase
PBXHeadersBuildPhase
PBXShellScriptBuildPhase
PBXBuildRule
PBXBuildFile
PBXReferenceProxy
PBXFileReference
PBXGroup
PBXVariantGroup
Contributions
License
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file xUnique-4.1.4.tar.gz
.
File metadata
- Download URL: xUnique-4.1.4.tar.gz
- Upload date:
- Size: 11.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 69cb36b6998129343f0a851d2542c9aaa590ee253fc22b8b5ed5cd73c70ea68a |
|
MD5 | 23d6b4d74d17c19e418c0f04d9766b87 |
|
BLAKE2b-256 | 64e0bd7e2ce2c78145578eea4c3e8d8cf2cd735545fb03207544e0a44e3410d4 |