Commit aeaaea034e8ef18bae002c4e317f91d2b751814c

Authored by Jürgen Knödlseder
1 parent cc01022c

Add ctools release manager

dev/release.py 0 → 100755
  1 +#! /usr/bin/env python
  2 +# ==========================================================================
  3 +# ctools release manager
  4 +#
  5 +# Copyright (C) 2016 Juergen Knoedlseder
  6 +#
  7 +# This program is free software: you can redistribute it and/or modify
  8 +# it under the terms of the GNU General Public License as published by
  9 +# the Free Software Foundation, either version 3 of the License, or
  10 +# (at your option) any later version.
  11 +#
  12 +# This program is distributed in the hope that it will be useful,
  13 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 +# GNU General Public License for more details.
  16 +#
  17 +# You should have received a copy of the GNU General Public License
  18 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  19 +#
  20 +# ==========================================================================
  21 +import os
  22 +import sys
  23 +import commands
  24 +
  25 +
  26 +# ================= #
  27 +# Confirm something #
  28 +# ================= #
  29 +def confirm(text):
  30 + """
  31 + Confirm something
  32 +
  33 + Parameters
  34 + ----------
  35 + text : str
  36 + Thing to confirm
  37 +
  38 + Returns
  39 + -------
  40 + flag : bool
  41 + True if something is confirmed
  42 + """
  43 + # Confirmation loop
  44 + waiting = True
  45 + while waiting:
  46 + confirmation = str(raw_input(text+' (y/n): '))
  47 + if confirmation == 'q':
  48 + sys.exit()
  49 + elif confirmation == 'y':
  50 + flag = True
  51 + waiting = False
  52 + elif confirmation == 'n':
  53 + flag = False
  54 + waiting = False
  55 +
  56 + # Return confirmation flag
  57 + return flag
  58 +
  59 +
  60 +# ============== #
  61 +# Commit changes #
  62 +# ============== #
  63 +def commit(message):
  64 + """
  65 + Commit changes into git repo
  66 +
  67 + Parameters
  68 + ----------
  69 + message : str
  70 + Commit message
  71 + """
  72 + # Show changes
  73 + print("The following files have been changed:")
  74 + os.system('git status -s')
  75 +
  76 + # Ask again whether the changes should be committed
  77 + if confirm("Commit all changes?"):
  78 +
  79 + # Optionally enter a commit message
  80 + if len(message) == 0:
  81 + message = str(raw_input("Please enter a commit message: "))
  82 +
  83 + # Stage all files
  84 + os.system('git add -u')
  85 +
  86 + # Commit all changes
  87 + os.system('git commit -m "%s"' % message)
  88 +
  89 + # Return
  90 + return
  91 +
  92 +
  93 +# ========================== #
  94 +# Check if git branch exists #
  95 +# ========================== #
  96 +def git_branch_exists(branch):
  97 + """
  98 + Check if git branch exists
  99 +
  100 + Parameters
  101 + ----------
  102 + branch : str
  103 + Branch name
  104 +
  105 + Returns
  106 + -------
  107 + exists : bool
  108 + True if git branch exists
  109 + """
  110 + # Check if git branch exists
  111 + rc = os.system('git rev-parse --verify %s >/dev/null 2>&1' % branch)
  112 +
  113 + # Set exists flag
  114 + if rc == 0:
  115 + exists = True
  116 + else:
  117 + exists = False
  118 +
  119 + # Return flag
  120 + return exists
  121 +
  122 +
  123 +# ================= #
  124 +# Create git branch #
  125 +# ================= #
  126 +def create_git_branch(branch):
  127 + """
  128 + Create a git branch
  129 +
  130 + Parameters
  131 + ----------
  132 + branch : str
  133 + Branch name
  134 + """
  135 + # If branch exists already then ask whether it should be deleted
  136 + if git_branch_exists(branch):
  137 + if confirm("Git branch '%s' exists already, do you want to delete "
  138 + "it?" % branch):
  139 + os.system('git branch -D %s' % branch)
  140 +
  141 + # If branch exists already then switch to the new branch, otherwise create
  142 + # new branch and switch to it
  143 + if git_branch_exists(branch):
  144 + os.system('git checkout %s' % branch)
  145 + else:
  146 + print("Created new branch '%s'" % branch)
  147 + os.system('git checkout -b %s' % branch)
  148 +
  149 + # Return
  150 + return
  151 +
  152 +
  153 +# ======================================= #
  154 +# Check whether version string is correct #
  155 +# ======================================= #
  156 +def check_version(version):
  157 + """
  158 + Check whether version string is correct
  159 +
  160 + Parameters
  161 + ----------
  162 + version : str
  163 + Version number
  164 +
  165 + Returns
  166 + -------
  167 + check : bool
  168 + True if version string is correct
  169 + """
  170 + # Initialise check with False
  171 + check = False
  172 +
  173 + # Split version string
  174 + split = version.split('.')
  175 +
  176 + # If there are three elements or four elements we may have a valid version
  177 + # string
  178 + if len(split) == 3 or len(split) == 4:
  179 +
  180 + # If the three first elements are integers we may have a valid version
  181 + # string
  182 + if split[0].isdigit() and split[1].isdigit() and split[2].isdigit():
  183 +
  184 + # If we have three elements the version is valid and we are done
  185 + if len(split) == 3:
  186 + check = True
  187 +
  188 + # Otherwise check if the 4th element is of format devn, where n
  189 + # is an integer number
  190 + elif split[3][0:3] == 'dev':
  191 + if split[3][3:].isdigit():
  192 + check = True
  193 +
  194 + # Return check
  195 + return check
  196 +
  197 +
  198 +# ========================== #
  199 +# Get current version number #
  200 +# ========================== #
  201 +def get_current_version():
  202 + """
  203 + Get current version number
  204 +
  205 + Returns
  206 + -------
  207 + version : str
  208 + Version number
  209 + """
  210 + # Initialse version number of empty string
  211 + version = ''
  212 +
  213 + # Open configure.ac file
  214 + f = open('configure.ac', 'r')
  215 +
  216 + # Read all lines
  217 + for line in f:
  218 +
  219 + # Search for pattern
  220 + if line.startswith('AC_INIT('):
  221 +
  222 + # Extract version number
  223 + start = line.find(',')+1
  224 + stop = line.find(',', start)
  225 + version = line[start:stop].strip().lstrip('[').rstrip(']')
  226 +
  227 + # Close file
  228 + f.close()
  229 +
  230 + # Return version
  231 + return version
  232 +
  233 +
  234 +# ========================== #
  235 +# Get libtool version number #
  236 +# ========================== #
  237 +def get_libtool_version():
  238 + """
  239 + Get libtools version number
  240 +
  241 + Returns
  242 + -------
  243 + version : str
  244 + Version number
  245 + """
  246 + # Initialse version number of empty string
  247 + version = ''
  248 +
  249 + # Open configure.ac file
  250 + f = open('configure.ac', 'r')
  251 +
  252 + # Read all lines
  253 + for line in f:
  254 +
  255 + # Search for pattern
  256 + if line.startswith('CTOOLS_LT_VERSION='):
  257 +
  258 + # Extract version number
  259 + start = line.find('"')+1
  260 + stop = line.find('"', start)
  261 + version = line[start:stop].strip()
  262 +
  263 + # Close file
  264 + f.close()
  265 +
  266 + # Return version
  267 + return version
  268 +
  269 +
  270 +# =============================================== #
  271 +# Set libtool version number in configure.ac file #
  272 +# =============================================== #
  273 +def set_libtool_version(library=False, added=False, removed=False, changed=False):
  274 + """
  275 + Set special version numbers in configure.ac file
  276 +
  277 + Parameters
  278 + ----------
  279 + library : bool, optional
  280 + Library source code changed
  281 + added : bool, optional
  282 + Interfaces added
  283 + removed : bool, optional
  284 + Interfaces removed
  285 + changed : bool, optional
  286 + Interfaces changed
  287 + """
  288 + # Get libtool version number
  289 + old = get_libtool_version()
  290 + split = old.split(':')
  291 +
  292 + # Decompose libtool version number
  293 + current = int(split[0])
  294 + revision = int(split[1])
  295 + age = int(split[2])
  296 +
  297 + # If the library source code has changed at all since the last update, then
  298 + # increment revision
  299 + if library:
  300 + revision += 1
  301 +
  302 + # If any interfaces have been added, removed, or changed since the last
  303 + # update, increment current, and set revision to 0
  304 + if added or removed or changed:
  305 + current += 1
  306 + revision = 0
  307 +
  308 + # If any interfaces have been added since the last public release, then
  309 + # increment age
  310 + if added:
  311 + age += 1
  312 +
  313 + # If any interfaces have been removed or changed since the last public
  314 + # release, then set age to 0
  315 + if removed or changed:
  316 + age = 0
  317 +
  318 + # Build new libtool version number
  319 + version = '%d:%d:%d' % (current, revision, age)
  320 +
  321 + # Set libtool version number
  322 + set_version_in_file('configure.ac', version, old)
  323 +
  324 + # Return
  325 + return
  326 +
  327 +
  328 +# ============================== #
  329 +# Set version number in one file #
  330 +# ============================== #
  331 +def set_version_in_file(filename, version, current):
  332 + """
  333 + Set version number in one file
  334 +
  335 + The function replaces all current version numbers in a file by a new
  336 + version number.
  337 +
  338 + Parameters
  339 + ----------
  340 + filename : str
  341 + File name
  342 + version : str
  343 + New version number
  344 + current : str
  345 + Current version number
  346 + """
  347 + # Open file in read mode
  348 + f = open(filename, 'r')
  349 +
  350 + # Read file content
  351 + content = f.read()
  352 +
  353 + # Close file
  354 + f.close()
  355 +
  356 + # Replace version number
  357 + new_content = content.replace(current, version)
  358 +
  359 + # Open file in write mode
  360 + f = open(filename, 'w')
  361 +
  362 + # Write file content
  363 + f.write(new_content)
  364 +
  365 + # Close file
  366 + f.close()
  367 +
  368 + # Return
  369 + return
  370 +
  371 +
  372 +# ======================= #
  373 +# Set the package version #
  374 +# ======================= #
  375 +def set_package_version(version):
  376 + """
  377 + Set the package version
  378 +
  379 + Parameters
  380 + ----------
  381 + version : str
  382 + Version number
  383 + """
  384 + # List of all files in which the version numbers should be changed. The
  385 + # file name should include their access paths with respect to the source
  386 + # directory
  387 + filenames = ['configure.ac',
  388 + 'ctools.pc.in',
  389 + 'README.md',
  390 + 'sonar-project.properties',
  391 + 'doc/Doxyfile',
  392 + 'doc/source/conf.py']
  393 +
  394 +
  395 + # Get the current package version
  396 + current = get_current_version()
  397 +
  398 + # Set versions by loop over all files
  399 + for filename in filenames:
  400 + set_version_in_file(filename, version, current)
  401 +
  402 + # Generate current version number
  403 + split = current.split('.')
  404 + cur = '%s.%s' % (split[0], split[1])
  405 +
  406 + # Generate new version number
  407 + split = version.split('.')
  408 + ver = '%s.%s' % (split[0], split[1])
  409 +
  410 + # Set version number in doc/source/conf.py file
  411 + set_version_in_file('doc/source/conf.py', ver, cur)
  412 +
  413 + # Return
  414 + return
  415 +
  416 +
  417 +# ============= #
  418 +# Build tarball #
  419 +# ============= #
  420 +def build_tarball():
  421 + """
  422 + Build tarball using 'make dist'
  423 + """
  424 + # Set base path
  425 + base_path = os.getcwd()
  426 +
  427 + # Enable/disable logging
  428 + if confirm("Log actions in logfile?"):
  429 + verbosity = ' >> %s/make_dist.log 2>&1' % (base_path)
  430 + os.system('rm -rf make_dist.log >/dev/null 2>&1')
  431 + else:
  432 + verbosity = ' >/dev/null 2>&1'
  433 +
  434 + # Configure package
  435 + print("Configure package")
  436 + rc = os.system('./configure%s' % verbosity)
  437 + if rc == 0:
  438 + print("Package configuration successful")
  439 + else:
  440 + print("*** Failure in package configuration")
  441 +
  442 + # Check package
  443 + print("Create tarball")
  444 + rc = os.system('make dist%s' % verbosity)
  445 + if rc == 0:
  446 + print("Tarball creation successful")
  447 + else:
  448 + print("*** Failure in creation of tarball")
  449 +
  450 + # Return
  451 + return
  452 +
  453 +
  454 +# ============= #
  455 +# Check tarball #
  456 +# ============= #
  457 +def check_tarball():
  458 + """
  459 + Check tarball using 'make distcheck'
  460 +
  461 + Parameters
  462 + ----------
  463 + filename : str
  464 + Tarball file name
  465 + """
  466 + # Set base path
  467 + base_path = os.getcwd()
  468 +
  469 + # Enable/disable logging
  470 + if confirm("Log check in logfile?"):
  471 + verbosity = ' >> %s/make_distcheck.log 2>&1' % (base_path)
  472 + os.system('rm -rf make_distcheck.log >/dev/null 2>&1')
  473 + else:
  474 + verbosity = ' >/dev/null 2>&1'
  475 +
  476 + # Configure package
  477 + print("Configure package")
  478 + rc = os.system('./configure%s' % verbosity)
  479 + if rc == 0:
  480 + print("Package configuration successful")
  481 + else:
  482 + print("*** Failure in package configuration")
  483 +
  484 + # Check tarball
  485 + print("Check tarball")
  486 + rc = os.system('make distcheck%s' % verbosity)
  487 + if rc == 0:
  488 + print("Tarball checking successful")
  489 + else:
  490 + print("*** Failure in checking of tarball")
  491 +
  492 + # Return
  493 + return
  494 +
  495 +
  496 +# ================ #
  497 +# Manage main menu #
  498 +# ================ #
  499 +def main_menu():
  500 + """
  501 + Manage main menu
  502 + """
  503 + # Print main menu
  504 + print('[1] Make a new release')
  505 + print('[2] Set the package version in current branch')
  506 + print('[3] Set the libtool version in current branch')
  507 + print('[4] Commit changes in current branch')
  508 + print('[5] Create tarball from current branch')
  509 + print('[6] Check tarball')
  510 + print('[q] Quit')
  511 +
  512 + # Wait for the input
  513 + waiting = True
  514 + while waiting:
  515 + choice = str(raw_input('Enter your choice: '))
  516 + if choice == '1' or choice == '2' or choice == '3' or choice == '4' or \
  517 + choice == '5' or choice == '6' or choice == 'q':
  518 + waiting = False
  519 +
  520 + # Return choice
  521 + return choice
  522 +
  523 +
  524 +# ====================== #
  525 +# Manage package release #
  526 +# ====================== #
  527 +def release_menu(branch='release'):
  528 + """
  529 + Manage package release
  530 +
  531 + Parameters
  532 + ----------
  533 + branch : str, optional
  534 + Release branch name
  535 + """
  536 + # Annonce actions
  537 + print("")
  538 + print("Make a new release")
  539 + print("------------------")
  540 +
  541 + # Step 1: Create a release branch
  542 + if confirm("Step 1: Do you want to create a '%s' branch?" % branch):
  543 + create_git_branch(branch)
  544 + else:
  545 + if git_branch_exists(branch):
  546 + os.system('git checkout %s' % branch)
  547 + else:
  548 + requested = branch
  549 + branch = commands.getoutput('git rev-parse --abbrev-ref HEAD')
  550 + print("WARNING: No '%s' branch found, continue working on "
  551 + "current branch '%s'" % (requested, branch))
  552 +
  553 + # Get current package version
  554 + current = get_current_version()
  555 +
  556 + # Step 2: Set package version
  557 + print("")
  558 + if confirm("Step 2: Current ctools version is '%s'. Do you want to "
  559 + "change the package version?" % current):
  560 + package_version_menu()
  561 +
  562 + # Get current libtool version
  563 + current = get_libtool_version()
  564 +
  565 + # Step 3: Set libtool version
  566 + print("")
  567 + if confirm("Step 3: Current Libtool version is '%s'. Do you want to "
  568 + "change the libtool version?" % current):
  569 + libtool_version_menu()
  570 +
  571 + # Step 4: Commit changes
  572 + print("")
  573 + if confirm("Step 4: Commit changes?"):
  574 + package = get_current_version()
  575 + libtool = get_libtool_version()
  576 + message = "ctools package version set to '%s' and libtool version "\
  577 + "set to '%s'" % (package, libtool)
  578 + commit(message)
  579 +
  580 + # Step 5: Push branch into git
  581 + print("")
  582 + if confirm("Step 5: Push changes?"):
  583 + os.system('git push origin %s' % branch)
  584 +
  585 + # Step 6: Build tarball
  586 + print("")
  587 + if confirm("Step 6: Build tarball?"):
  588 + build_tarball()
  589 +
  590 + # Step 7: Check tarball
  591 + print("")
  592 + if confirm("Step 7: Check tarball?"):
  593 + check_tarball()
  594 +
  595 + # Print separator
  596 + print("")
  597 +
  598 + # Return
  599 + return
  600 +
  601 +
  602 +# ============================== #
  603 +# Manage package version setting #
  604 +# ============================== #
  605 +def package_version_menu():
  606 + """
  607 + Manage package version setting
  608 + """
  609 + # Get the current package version
  610 + current = get_current_version()
  611 +
  612 + # Looping until the version change is accepted
  613 + looping = True
  614 + while looping:
  615 +
  616 + # Get package version from input
  617 + waiting = True
  618 + while waiting:
  619 + version = str(raw_input("Current ctools version is '%s'. Please "
  620 + "enter new ctools version: " % current))
  621 + if version == "q":
  622 + sys.exit()
  623 + if check_version(version) == False:
  624 + print("*** Invalid ctools version. "
  625 + "Please enter the version in the format x.y.z[.devn]")
  626 + else:
  627 + waiting = False
  628 +
  629 + # If the version number change is confirmed then do the change
  630 + if confirm("Change version to '%s'?" % version):
  631 +
  632 + # Set package version
  633 + set_package_version(version)
  634 +
  635 + # Get new package and libtool versions
  636 + version = get_current_version()
  637 +
  638 + # Inform about version change
  639 + print("ctools version changed to '%s'" % (version))
  640 +
  641 + # Signal that we can exit looping
  642 + looping = False
  643 +
  644 + # Return
  645 + return
  646 +
  647 +
  648 +# ============================== #
  649 +# Manage libtool version setting #
  650 +# ============================== #
  651 +def libtool_version_menu():
  652 + """
  653 + Manage libtool version setting
  654 + """
  655 + # Get current libtool version
  656 + current = get_libtool_version()
  657 +
  658 + # Continue only if libtool version should be changed
  659 + if confirm("Current libtool version is '%s'. Do you want to change the "
  660 + "version?" % current):
  661 +
  662 + # Determine package changes
  663 + library = confirm(" Has the source code changed since last release?")
  664 + added = confirm(" Have interfaces been added since last release?")
  665 + removed = confirm(" Have interfaces been removed since last release?")
  666 + changed = confirm(" Have interfaces changed since last release?")
  667 +
  668 + # Set libtool version
  669 + set_libtool_version(library=library, added=added, removed=removed,
  670 + changed=changed)
  671 +
  672 + # Get new libtool version
  673 + version = get_libtool_version()
  674 +
  675 + # Print new libtool version
  676 + print("Libtool version changed to '%s'" % version)
  677 +
  678 + # Return
  679 + return
  680 +
  681 +
  682 +# ======================== #
  683 +# Main routine entry point #
  684 +# ======================== #
  685 +if __name__ == '__main__':
  686 +
  687 + # Clear console
  688 + os.system('clear')
  689 +
  690 + # Print header
  691 + print('ctools release manager')
  692 + print('======================')
  693 + print('')
  694 +
  695 + # Enter endless loop
  696 + while True:
  697 +
  698 + # Show main menu
  699 + choice = main_menu()
  700 +
  701 + # Dispatch according to choice
  702 + if choice == '1':
  703 + release_menu()
  704 + print('')
  705 + elif choice == '2':
  706 + package_version_menu()
  707 + print('')
  708 + elif choice == '3':
  709 + libtool_version_menu()
  710 + print('')
  711 + elif choice == '4':
  712 + commit('')
  713 + print('')
  714 + elif choice == '5':
  715 + build_tarball()
  716 + print('')
  717 + elif choice == '6':
  718 + check_tarball()
  719 + print('')
  720 + elif choice == 'q':
  721 + break
  722 +
dev/set_version.py deleted
1 -#! /usr/bin/env python  
2 -# ==========================================================================  
3 -# Set the version number of the software  
4 -#  
5 -# Copyright (C) 2016 Juergen Knoedlseder  
6 -#  
7 -# This program is free software: you can redistribute it and/or modify  
8 -# it under the terms of the GNU General Public License as published by  
9 -# the Free Software Foundation, either version 3 of the License, or  
10 -# (at your option) any later version.  
11 -#  
12 -# This program is distributed in the hope that it will be useful,  
13 -# but WITHOUT ANY WARRANTY; without even the implied warranty of  
14 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
15 -# GNU General Public License for more details.  
16 -#  
17 -# You should have received a copy of the GNU General Public License  
18 -# along with this program. If not, see <http://www.gnu.org/licenses/>.  
19 -#  
20 -# ==========================================================================  
21 -import sys  
22 -  
23 -  
24 -# ========================== #  
25 -# Get current version number #  
26 -# ========================== #  
27 -def get_current():  
28 - """  
29 - Get current version number  
30 -  
31 - Returns  
32 - -------  
33 - version : str  
34 - Version number  
35 - """  
36 - # Initialse version number of empty string  
37 - version = ''  
38 -  
39 - # Open configure.ac file  
40 - f = open('configure.ac', 'r')  
41 -  
42 - # Read all lines  
43 - for line in f:  
44 -  
45 - # Search for pattern  
46 - if line.startswith('AC_INIT('):  
47 -  
48 - # Extract version number  
49 - start = line.find(',')+1  
50 - stop = line.find(',', start)  
51 - version = line[start:stop].strip().lstrip('[').rstrip(']')  
52 -  
53 - # Close file  
54 - f.close()  
55 -  
56 - # Return version  
57 - return version  
58 -  
59 -  
60 -# ========================== #  
61 -# Get libtool version number #  
62 -# ========================== #  
63 -def get_libtool():  
64 - """  
65 - Get libtools version number  
66 -  
67 - Returns  
68 - -------  
69 - version : str  
70 - Version number  
71 - """  
72 - # Initialse version number of empty string  
73 - version = ''  
74 -  
75 - # Open configure.ac file  
76 - f = open('configure.ac', 'r')  
77 -  
78 - # Read all lines  
79 - for line in f:  
80 -  
81 - # Search for pattern  
82 - if line.startswith('CTOOLS_LT_VERSION='):  
83 -  
84 - # Extract version number  
85 - start = line.find('"')+1  
86 - stop = line.find('"', start)  
87 - version = line[start:stop].strip()  
88 -  
89 - # Close file  
90 - f.close()  
91 -  
92 - # Return version  
93 - return version  
94 -  
95 -  
96 -# ============================== #  
97 -# Set version number in one file #  
98 -# ============================== #  
99 -def set_version(filename, version, current):  
100 - """  
101 - Set version number  
102 -  
103 - Parameters  
104 - ----------  
105 - filename : str  
106 - File name  
107 - version : str  
108 - Version number  
109 - current : str  
110 - Current version number  
111 - """  
112 - # Open file in read mode  
113 - f = open(filename, 'r')  
114 -  
115 - # Read file content  
116 - content = f.read()  
117 -  
118 - # Close file  
119 - f.close()  
120 -  
121 - # Replace version number  
122 - new_content = content.replace(current, version)  
123 -  
124 - # Open file in write mode  
125 - f = open(filename, 'w')  
126 -  
127 - # Write file content  
128 - f.write(new_content)  
129 -  
130 - # Close file  
131 - f.close()  
132 -  
133 - # Return  
134 - return  
135 -  
136 -  
137 -# =============================== #  
138 -# Set version number in all files #  
139 -# =============================== #  
140 -def set_versions(version, current):  
141 - """  
142 - Set version numbers in all files  
143 -  
144 - Parameters  
145 - ----------  
146 - version : str  
147 - Version number  
148 - current : str  
149 - Current version number  
150 - """  
151 - # List of all relevant files, including their access paths from the  
152 - # source directory  
153 - filenames = ['configure.ac',  
154 - 'ctools.pc.in',  
155 - 'README.md',  
156 - 'sonar-project.properties',  
157 - 'doc/Doxyfile',  
158 - 'doc/source/conf.py']  
159 -  
160 - # Set versions by loop over all files  
161 - for filename in filenames:  
162 - set_version(filename, version, current)  
163 -  
164 - # Return  
165 - return  
166 -  
167 -  
168 -# =============================================== #  
169 -# Set libtool version number in configure.ac file #  
170 -# =============================================== #  
171 -def set_libtool_version(library=False, added=False, removed=False, changed=False):  
172 - """  
173 - Set special version numbers in configure.ac file  
174 -  
175 - Parameters  
176 - ----------  
177 - library : bool, optional  
178 - Library source code changed  
179 - added : bool, optional  
180 - Interfaces added  
181 - removed : bool, optional  
182 - Interfaces removed  
183 - changed : bool, optional  
184 - Interfaces changed  
185 - """  
186 - # Get libtool version number  
187 - old = get_libtool()  
188 - split = old.split(':')  
189 -  
190 - # Decompose libtool version number  
191 - current = int(split[0])  
192 - revision = int(split[1])  
193 - age = int(split[2])  
194 -  
195 - # If the library source code has changed at all since the last update, then  
196 - # increment revision  
197 - if library:  
198 - revision += 1  
199 -  
200 - # If any interfaces have been added, removed, or changed since the last  
201 - # update, increment current, and set revision to 0  
202 - if added or removed or changed:  
203 - current += 1  
204 - revision = 0  
205 -  
206 - # If any interfaces have been added since the last public release, then  
207 - # increment age  
208 - if added:  
209 - age += 1  
210 -  
211 - # If any interfaces have been removed or changed since the last public  
212 - # release, then set age to 0  
213 - if removed or changed:  
214 - age = 0  
215 -  
216 - # Build new libtool version number  
217 - version = '%d:%d:%d' % (current, revision, age)  
218 -  
219 - # Set libtool version number  
220 - set_version('configure.ac', version, old)  
221 -  
222 - # Return  
223 - return  
224 -  
225 -  
226 -# ===================================================== #  
227 -# Set special version number in doc/source/conf.py file #  
228 -# ===================================================== #  
229 -def set_special_conf(version, current):  
230 - """  
231 - Set special version numbers in doc/source/conf.py file  
232 -  
233 - Parameters  
234 - ----------  
235 - version : str  
236 - Version number  
237 - current : str  
238 - Current version number  
239 - """  
240 - # Generate current version number  
241 - split = current.split('.')  
242 - cur = '%s.%s' % (split[0], split[1])  
243 -  
244 - # Generate new version number  
245 - split = version.split('.')  
246 - ver = '%s.%s' % (split[0], split[1])  
247 -  
248 - # Set version number  
249 - set_version('doc/source/conf.py', ver, cur)  
250 -  
251 - # Return  
252 - return  
253 -  
254 -  
255 -# ======================== #  
256 -# Main routine entry point #  
257 -# ======================== #  
258 -if __name__ == '__main__':  
259 -  
260 - # Check for version number  
261 - if len(sys.argv) < 3:  
262 - print('Usage: set_version.py version [larc]')  
263 - print(' l : source code changed')  
264 - print(' a : interface(s) added')  
265 - print(' r : interface(s) removed')  
266 - print(' c : interface(s) changed')  
267 - sys.exit()  
268 -  
269 - # Extract version number  
270 - version = sys.argv[1]  
271 -  
272 - # Extract code change flags  
273 - if len(sys.argv) == 3:  
274 - flags = sys.argv[2]  
275 -  
276 - # Set change flags  
277 - library = False  
278 - added = False  
279 - removed = False  
280 - changed = False  
281 - if flags.find('l') != -1:  
282 - library = True  
283 - if flags.find('a') != -1:  
284 - added = True  
285 - if flags.find('r') != -1:  
286 - removed = True  
287 - if flags.find('c') != -1:  
288 - changed = True  
289 -  
290 - # Get the current version  
291 - current = get_current()  
292 -  
293 - # Set versions  
294 - set_versions(version, current)  
295 -  
296 - # Set libtool version  
297 - set_libtool_version(library=library, added=added, removed=removed,  
298 - changed=changed)  
299 -  
300 - # Set special version number in doc/source/conf.py file  
301 - set_special_conf(version, current)  
302 -