Insert Subversion revision number in Xcode

后端 未结 7 1599
花落未央
花落未央 2020-11-30 18:29

I would like to insert the current Subversion revision number (as reported by svnversion) into my Xcode project. I managed to insert the revision number into th

相关标签:
7条回答
  • 2020-11-30 18:54

    Another version, written in the Apple Script. Regexp for the previousValue could be changed, currently it supports only versions in XX.XX.XX format (major, minor, svn rev).

    Run by /usr/bin/osascript

    set myVersion to do shell script "svn info | grep \"^Revision:\""
    set myVersion to do shell script "echo " & quoted form of myVersion & "| sed 's/Revision: \\([0-9]\\)/\\1/'" as string
    
    set myFile to do shell script "echo ${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
    set theOutputFolder to myFile as string
    set thePListPath to POSIX path of (theOutputFolder & "Info.plist")
    tell application "System Events"
       tell property list file thePListPath
          tell contents
             set previousValue to value of property list item "CFBundleVersion"
    
             set previousValue to do shell script "echo " & quoted form of previousValue & "| sed 's/\\([0-9]*\\.[0-9]*\\)\\(\\.[0-9]*\\)*/\\1/'" as string
    
             set value of property list item "CFBundleVersion" to (previousValue & "." & myVersion)
          end tell
       end tell
    end tell
    
    0 讨论(0)
  • 2020-11-30 18:57

    For posterity, I did something similar to zoul for iPhone applications, by adding a revision.h to my project, then adding the following as a Run Script build phase:

    REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
    echo "#define kRevisionNumber @\"$REV\"" > ${PROJECT_DIR}/revision.h
    

    I did this to grab a simple revision number, as opposed to the more detailed string that svnversion produces in zoul's solution.

    For Mac applications, I based my approach on this post, and instead created a buildnumber.xcconfig file. Under the build settings for the target, I changed the Based On value in the lower-right-hand corner of the dialog to buildnumber.xcconfig. Within the Info.plist, I edited the following lines:

    <key>CFBundleVersion</key>
    <string>${BUILD_NUMBER}</string>
    <key>CFBundleShortVersionString</key>
    <string>Version 1.0</string>
    

    So that my About dialog would display a version string similar to Version 1.0 (1234), where 1234 is the Subversion revision number. Finally, I created a Run Script build phase with the following code:

    REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
    echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig
    

    This may not be the cleanest way, as it requires a clean cycle before building for the new revision to take hold in the application, but it works.

    0 讨论(0)
  • 2020-11-30 18:57

    I found this page when trying to do a similar thing for my iPhone app and thought it might be helpful to share the code I decided on. I was trying to have a base version number set in my Target Info (for example 0.9.5) but then append my SVN revision number at the end of it. I needed this stored in CFBundleVersion so that AdHoc users would be able to update via iTunes even if I didn't remember to rev the version number in my Target Info pane. That's why I couldn't use the "revision.h" method which otherwise worked beautifully. Here's the final code I settled on which I've placed as a Run Script phase just after the "Copy Bundle Resources" build phase:

    BASEVERNUM=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}" | sed 's/,/, /g'`
    REV=`svnversion -n`
    SVNDATE=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'`
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BASEVERNUM.$REV" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
    /usr/libexec/PlistBuddy -c "Set :BuildDateString $SVNDATE" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
    

    It should append the results of svnversion to the end of whatever is set in the base Info.plist as the version. This way you can have something like 0.9.5 in your info plist and still have the .189 revision number appended at the end, giving a final version number of 0.9.5.189

    Hope this helps someone else!

    0 讨论(0)
  • 2020-11-30 19:05
    # Xcode auto-versioning script for Subversion
    # by Axel Andersson, modified by Daniel Jalkut to add
    # "--revision HEAD" to the svn info line, which allows
    # the latest revision to always be used.
    #
    # modified by JM Marino to change only [BUILD] motif
    # into CFBundleGetInfoString key.
    #
    # HOW TO USE IT: just add [BUILD] motif to your Info.plist key :
    #       CFBundleVersion
    #
    # EXAMPLE: version 1.3.0 copyright 2003-2009 by JM Marino
    # with [BUILD] into CFBundleVersion key
    
    use strict;
    
    die "$0: Must be run from Xcode" unless $ENV{"BUILT_PRODUCTS_DIR"};
    
    # Get the current subversion revision number and use it to set the CFBundleVersion value
    #my $REV = `/usr/local/bin/svnversion -n ./`;
    my $REV = `/usr/bin/svnversion -n ./`;
    my $INFO = "$ENV{BUILT_PRODUCTS_DIR}/$ENV{WRAPPER_NAME}/Contents/Info.plist";
    
    my $version = $REV;
    
    # (Match the last group of digits without optional letter M | S):
    ($version =~ m/(\d+)[MS]*$/) && ($version = "" . $1);
    
    die "$0: No Subversion revision found" unless $version;
    
    open(FH, "$INFO") or die "$0: $INFO: $!";
    my $info = join("", <FH>);
    close(FH);
    
    #$info =~ s/([\t ]+<key>CFBundleVersion<\/key>\n[\t ]+<string>.+)\[BUILD\](<\/string>)/$1$version$2/;
    $info =~ s/([\t ]+<key>CFBundleVersion<\/key>\n[\t ]+<string>)\[BUILD\](<\/string>)/$1$version$2/;
    
    open(FH, ">$INFO") or die "$0: $INFO: $!";
    print FH $info;
    close(FH);
    
    0 讨论(0)
  • 2020-11-30 19:05

    Since I can't comment on Quinn's answer:

    if you're using the MacPorts svn client, it may be necessary to include the full path of the svnversion command, /opt/local/bin/svnversion in my case. I also added the -c option to svnversion.

    Also, if you're only interested in the second version number of mixed revisions, add a 'cut' command to the invocation, like this:

    echo -n "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" \
    | xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `/opt/local/bin/svnversion -nc | cut -f2 -d:`"
    
    0 讨论(0)
  • 2020-11-30 19:07

    There's a much simpler solution: using PlistBuddy, included at /usr/libexec/PlistBuddy in Leopard. See my answer to a related SO question for details.

    PlistBuddy can be used in a Run Script build phase from within Xcode, and can be used to only affect the processed plist file. Just put it after the Copy Resources phase, and you don't even have to clean the target for it to run each time. You don't even have to print the value to a header file and make SVN ignore it, either.

    echo -n ${TARGET_BUILD_DIR}/${INFOPLIST_PATH} \
        | xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `svnversion -n`"
    

    Assuming you add the build phase before code signing occurs, your plist should be signed with the substituted value.

    0 讨论(0)
提交回复
热议问题