From 1e6d80d47f07f5d1404b01ee71cb0f9cf098c430 Mon Sep 17 00:00:00 2001 From: Gennady Pospelov <g.pospelov@fz-juelich.de> Date: Wed, 30 Jul 2014 14:27:53 +0200 Subject: [PATCH] On the way to new release script. --- CMakeLists.txt | 1 + cmake/modules/BornAgainConfiguration.cmake | 16 +- dev-tools/git-utils/lines_of_code.png | Bin 20560 -> 20943 bytes dev-tools/git-utils/lines_of_code.py | 303 --------------------- dev-tools/release/make_release.py | 67 +++++ dev-tools/release/make_release.sh | 39 +-- 6 files changed, 99 insertions(+), 327 deletions(-) delete mode 100644 dev-tools/git-utils/lines_of_code.py create mode 100644 dev-tools/release/make_release.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e008214509..933dc818d6d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,7 @@ option(BORNAGAIN_MAN "Build a user manual" OFF) option(BUILD_DEBIAN "Build a debian package" OFF) option(ROOT_SUPPORT "Build with dependencies from ROOT" ON) option(BORNAGAIN_OPENMPI "Build with OpenMPI support" OFF) +option(BORNAGAIN_RELEASE "Special option for making release" OFF) # --- Path for additional cmake modules --- diff --git a/cmake/modules/BornAgainConfiguration.cmake b/cmake/modules/BornAgainConfiguration.cmake index c43049cef6d..b913f04d86b 100644 --- a/cmake/modules/BornAgainConfiguration.cmake +++ b/cmake/modules/BornAgainConfiguration.cmake @@ -40,18 +40,20 @@ configure_file( "${CMAKE_SOURCE_DIR}/Core/Samples/inc/BAVersion.h" ) -# --- configure deployment script for release -configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/release.sh.in" "${CMAKE_BINARY_DIR}/bin/release.sh") - # --- configure user setup script configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/thisbornagain.sh.in" "${CMAKE_BINARY_DIR}/bin/thisbornagain.sh" @ONLY) configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/thisbornagain.csh.in" "${CMAKE_BINARY_DIR}/bin/thisbornagain.csh" @ONLY) -# --- configure project paths -configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/BAConfigure.h.in" "${CMAKE_SOURCE_DIR}/Core/Tools/inc/BAConfigure.h" @ONLY) +if(BORNAGAIN_RELEASE) + # --- configure deployment script for release + configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/release.sh.in" "${CMAKE_BINARY_DIR}/bin/release.sh") + + # --- configure project paths + configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/BAConfigure.h.in" "${CMAKE_SOURCE_DIR}/Core/Tools/inc/BAConfigure.h" @ONLY) -# --- configure Doxyfile -configure_file("${CMAKE_SOURCE_DIR}/Doc/Doxygen/Doxyfile.in" "${CMAKE_SOURCE_DIR}/Doc/Doxygen/Doxyfile" @ONLY) + # --- configure Doxyfile + configure_file("${CMAKE_SOURCE_DIR}/Doc/Doxygen/Doxyfile.in" "${CMAKE_SOURCE_DIR}/Doc/Doxygen/Doxyfile" @ONLY) +endif() # --- installation if(NOT WIN32) diff --git a/dev-tools/git-utils/lines_of_code.png b/dev-tools/git-utils/lines_of_code.png index ad533579d0fc32b7e1e47de00d5bcd13e4a162bc..cf5f7540478ab6840d8bc14feae481a8e6664ca5 100644 GIT binary patch literal 20943 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 B6OI4? literal 20560 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 diff --git a/dev-tools/git-utils/lines_of_code.py b/dev-tools/git-utils/lines_of_code.py deleted file mode 100644 index 0be19b7ee82..00000000000 --- a/dev-tools/git-utils/lines_of_code.py +++ /dev/null @@ -1,303 +0,0 @@ -#!/usr/bin/env python - -# calculate number of lines of code in BornAgain project as a function of time -# -# should be executed either from parent directory -# "python Macros/GitUtils/git_loc_history.py" -# or from local one -# "python git_loc_history ../.." -# -# based on 'git-loc' from from https://github.com/ITikhonov/git-loc -# -# ROOT graphics added -# see http://root.cern.ch/drupal/content/how-use-use-python-pyroot-interpreter - -import re -from email.utils import parsedate -from time import mktime -from datetime import datetime -from os import popen -import os -from sys import argv,stderr,stdout -import getopt -from array import array - -opts, args = getopt.getopt(argv[1:],None) -extfolder = False -if len(args) == 1: - extfolder = True - targetfolder = args[0] - -fc=0 -locs=0 -locs_type=[0,0,0,0,0,0,0,0,0] -# 0 1 2 3 4 5 6 7 8 -descr=["Core","Functional Tests","Unit Tests","*.py","macros","GUI", "PythonAPI","Third","Undef"] -adds=None -cmt=None -prev_time = datetime(2000,1,1) - -history=[] - -def pop(): - if adds is not None: - pstr="%s %8u %5s %5s %7s %s \t%s"%(d,locs,'+'+str(adds),'-'+str(dels),hsh,who,cmt.strip()) - print pstr - atmp = [] - for x in locs_type: - atmp.append(x) - history.append((d,locs,atmp,adds,dels,hsh,who,cmt)) - -def filePython(x): - if ".py" in x and not ".pypp." in x: return True - return False - -def fileCpp(x): - if ".h" in x or ".cpp" in x: return True - return False - -def dirCore(x): - if "/Core/Algorithms" in x: return True - if "/Core/FormFactors" in x: return True - if "/Core/Samples" in x: return True - if "/Core/Tools" in x: return True - if "/Core/Fitting" in x: return True - if "/Core/inc" in x: return True - if "/Core/src" in x: return True - if "/Fit/Factory" in x: return True - if "/Core/Geometry" in x: return True - return False - -def dirPyAPI(x): - if "/Core/PythonAPI" in x: return True - if "/Fit/PythonAPI" in x: return True - return False - -def dirFuncTest(x): - if "/App/" in x: return True - if "/Tests/FunctionalTests/TestCore" in x: return True - if "/Tests/FunctionalTests/TestFit" in x: return True - if "/Tests/FunctionalTests/TestPyCore" in x: return True - if "/Tests/FunctionalTests/TestPyFit" in x: return True - return False - -def dirGUI(x): - if "/GUI/coregui" in x and not "widgetbox" in x and not "qttools" in x: return True - if "/AppGUI/coregui" in x: return True - if "/BASuite" in x: return True - return False - -def dirThirdParty(x): - if "/ThirdParty" in x: return True - return False - -def dirSkip(x): - if "/pub/core" in x: return True - return False - -def dirUnitTests(x): - if "/UnitTests/" in x: return True - if "/Tests/UnitTests/TestCore/" in x: return True - return False - - -# ------------------------------------------------------------------------------ -def filetype(x): - file_type=8 - - if dirSkip(x): return file_type - - if fileCpp(x) and dirCore(x): - file_type = 0 - elif (fileCpp(x) or filePython(x)) and dirFuncTest(x): - file_type = 1 - - elif dirUnitTests(x): - file_type = 2 - - elif dirGUI(x): - file_type = 5 - - elif dirPyAPI(x): - file_type = 6 - - elif dirThirdParty(x): - file_type = 7 - return file_type - - -# ------------------------------------------------------------------------------ -prevfolder = os.getcwd() -if extfolder: os.chdir(targetfolder) - -# parsing output of git log -file_type_ppp = 8 -file_type_mmm = 8 -for x in popen('git log develop --reverse -p'): - if x.startswith('commit'): - pop() - hsh=x[7:14]; - if x.startswith('Author'): - who=x.replace("Author: ",'').replace('\n',''); - who=re.sub(">.*","",who); - who=re.sub(".*<","",who); - if x.startswith('Date'): - fc=1 - d=datetime(*parsedate(x[5:])[:7]) - t=mktime(parsedate(x[5:])) - adds=0 - dels=0 - print x - if fc==2: - cmt=x[:-1] - fc=0 - if fc==1: - if len(x)==1: fc=2 - if x.startswith('+++'): - file_type_ppp = filetype(x) - - if x.startswith('---'): - file_type_mmm = filetype(x) - - if x.startswith('+') and not x.startswith('+++'): - locs_type[file_type_ppp] += 1 - if file_type_ppp <6: - adds+=1 - locs+=1 - if x.startswith('-') and not x.startswith('---'): - locs_type[file_type_mmm] -= 1 - if file_type_mmm <6: - dels+=1 - locs-=1 - -pop() -os.chdir(prevfolder) - - -# -------------------------------------------------------- -# making ROOT plot - number of lines of code .vs. time -# -------------------------------------------------------- -from ROOT import * - -# beginning of coding (first commit) to set beginning of time x-scale -c=history[0] -td_first=TDatime(c[0].year, c[0].month, c[0].day, c[0].hour, c[0].minute, c[0].second) -c=history[-1] -td_last=TDatime(c[0].year, c[0].month, c[0].day, c[0].hour, c[0].minute, c[0].second) -time_offset = int(td_first.Convert()) - 7*24.*3600 # one week before first commit - -ntimebins = 4*int((td_last.Convert() - time_offset)/3600./24) - - -#print "ntimebins", ntimebins -hist_ncommits = TH1D("ncommits", "ncommits", ntimebins, td_first.Convert() - time_offset, td_last.Convert() - time_offset) - - -# --------------------------------- -# creating histograms -# --------------------------------- -selected_hist = [0,1,2,5,6] - -a_histograms = [] -hstack = THStack("hstack","Number of Lines of Code") -hstack.SetTitle(""); - -a_colors=[kAzure+1, kOrange, kRed, kGreen, kYellow-7, kAzure, kGray+1] -legend = TLegend(0.15,0.65,0.49,0.84) -legend.SetBorderSize(1); -#legend.SetFillStyle(1); -for i in range(0, len(selected_hist) ): - i_hist = selected_hist[i] - #hist = TH1D(descr[i_hist],descr[i_hist],len(xtmp)-1,xtmp) - hist = TH1D(descr[i_hist],descr[i_hist], ntimebins, td_first.Convert() - time_offset, td_last.Convert() - time_offset ) - - hist.GetXaxis().SetTimeDisplay(1) - hist.GetXaxis().SetTimeFormat("%d/%m") - hist.GetYaxis().SetLabelSize(0.030) - hist.GetXaxis().SetLabelSize(0.035) - hist.GetXaxis().SetNdivisions(512) - hist.GetXaxis().SetTimeOffset(time_offset) - hist.SetLineColor(a_colors[i_hist]) - hist.SetFillColor(a_colors[i_hist]) - a_histograms.append(hist) - - -# adding histograms to legend in right order -for i_hist in range(len(a_histograms)-1,-1,-1): - legend.AddEntry(a_histograms[i_hist],a_histograms[i_hist].GetTitle(),"f") - -# filling histograms -for c in history: - td=TDatime(c[0].year, c[0].month, c[0].day, c[0].hour, c[0].minute, c[0].second) - xx = td.Convert() - time_offset - hist_ncommits.Fill(xx) - for i in range(0, len(selected_hist) ): - i_hist = selected_hist[i] - yy = c[2][i_hist] - a_histograms[i].Fill(xx,yy) - -# normalizing bin content on number of entries per bin -for i_bin in range(1,hist_ncommits.GetNbinsX()+1): - nentries = hist_ncommits.GetBinContent(i_bin) - for h in a_histograms: - current_bin_content = h.GetBinContent(i_bin) - if nentries != 0: current_bin_content /= nentries - h.SetBinContent(i_bin, current_bin_content) - -# filling empty bins with values from previous day -for h in a_histograms: - prev_content = 0 - for i_bin in range(1,h.GetNbinsX()+1): - if h.GetBinContent(i_bin) == 0: - h.SetBinContent(i_bin, prev_content) - prev_content = h.GetBinContent(i_bin) - - - - - - - - - -#preparing canvas -c1 = TCanvas( 'gisasfw_loc', 'Number of lines of code in BornAgain project', 800, 800) -c1.cd() -gPad.SetGrid() -gPad.SetBottomMargin(0.10) -gPad.SetLeftMargin(0.10) -gPad.SetTopMargin(0.10) -gPad.SetRightMargin(0.10) - -# drawing -for h in a_histograms: - hstack.Add(h,"][") -hstack.Draw() -hstack.GetXaxis().SetTimeDisplay(1) -#hstack.GetXaxis().SetTimeFormat("%d/%m") -hstack.GetXaxis().SetTimeFormat("#splitline{%d/%m}{%Y}") -hstack.GetXaxis().SetLabelSize(0.03) -hstack.GetYaxis().SetLabelSize(0.035) -hstack.GetXaxis().SetLabelOffset(0.02) -hstack.GetXaxis().SetNdivisions(512) -hstack.GetXaxis().SetTimeOffset(time_offset) - -legend.Draw() -c1.Modified() -c1.Modified() -c1.Update() -gPad.RedrawAxis() -gPad.RedrawAxis("G") - -c1.Print("lines_of_code.png") - - - -# wait for input to keep the GUI (which lives on a ROOT event dispatcher) alive -if __name__ == '__main__': - rep = '' - while not rep in [ 'q', 'Q' ]: - rep = raw_input( 'enter "q" to quit: ' ) - if 1 < len(rep): - rep = rep[0] - diff --git a/dev-tools/release/make_release.py b/dev-tools/release/make_release.py new file mode 100644 index 00000000000..c325f8e0b16 --- /dev/null +++ b/dev-tools/release/make_release.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +import sys +import os +import subprocess + + +def run_process(command, working_directory): + p = subprocess.Popen(command, cwd=working_directory, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + p.wait() + if p.returncode: + for line in iter(p.stderr.readline, b''): + print line + exit("Error while running the command '"+" ".join(command)+"'") + return not p.returncode + + +def git_clone(branch_name, working_directory): + print "Cloning BornAgain repository ... ", + cmd = ['git', 'clone', 'git@apps.jcns.fz-juelich.de:BornAgain.git'] + run_process(cmd, working_directory) + print " OK." + cmd = ['git', 'checkout', branch_name] + print "XXX", cmd, working_directory + run_process(cmd, working_directory) + + +def parse_release_name(release_branch_name): + name, version = release_branch_name.split("-") + version_major, version_minor, version_patch = version.split(".") + print version_major, version_minor, version_patch + return version_major, version_minor, version_patch + + +def prepare_release(release_branch_name, release_working_directory): + print "Preparing release working directory '%s'." % release_working_directory + # making directories + os.makedirs(release_working_directory) + os.makedirs(release_working_directory+"/build") + os.makedirs(release_working_directory+"/upload") + + # cloning git + #git_clone(release_branch_name, release_working_directory) + git_clone("develop", release_working_directory) + + + +def main(): + if len(sys.argv) != 2: + print "Please specify the name of the release branch." + print "Usage: python make_release.py release-0.9.3" + exit() + + release_branch_name = sys.argv[1] + + release_working_directory = os.getcwd() + "/" + release_branch_name + + if os.path.exists(release_working_directory): + print "Directory %s exists, continuing release process." % release_working_directory + else: + prepare_release(release_branch_name, release_working_directory) + + + + +if __name__ == '__main__': + main() diff --git a/dev-tools/release/make_release.sh b/dev-tools/release/make_release.sh index 2e548998e62..8b8a79b30c8 100755 --- a/dev-tools/release/make_release.sh +++ b/dev-tools/release/make_release.sh @@ -3,23 +3,28 @@ set -e -mkdir BornAgain-release -cd BornAgain-release -git clone git@apps.jcns.fz-juelich.de:BornAgain.git -cd BornAgain -git checkout PreRelease -cd .. -mkdir build -cd build -cmake ../BornAgain - -./bin/release.sh - -echo " " -echo "1) Modify BornAgain-release/build/RELEASE/CHANGELOG" -echo "2) Copy new Windows build into BornAgain-release/build/RELEASE" -echo "3) Run BornAgain-release/build/bin/release.sh with menu option #2 (upload on apps)" -echo "4) Run BornAgain-release/build/bin/release.sh with menu option #3 (finalize git)" +# set -e +# +# mkdir BornAgain-release +# cd BornAgain-release +# +# git clone git@apps.jcns.fz-juelich.de:BornAgain.git +# cd BornAgain +# git checkout PreRelease +# +# cd .. +# mkdir build +# cd build +# +# cmake ../BornAgain +# +# ./bin/release.sh +# +# echo " " +# echo "1) Modify BornAgain-release/build/RELEASE/CHANGELOG" +# echo "2) Copy new Windows build into BornAgain-release/build/RELEASE" +# echo "3) Run BornAgain-release/build/bin/release.sh with menu option #2 (upload on apps)" +# echo "4) Run BornAgain-release/build/bin/release.sh with menu option #3 (finalize git)" -- GitLab