Extract value of verison defined in package.json in bamboo task - bamboo

Is it possible to extract a package.json version value in a bamboo task? I want to extract the version field and save its value in a bamboo.variable.

Yes, try adding "Script" task into your Bamboo Job. In the script body you can add a code to read package.json version by using grep function from cat command output, and assign to a variable you like, e.g. PACKAGE_VERSION:
# Version key/value should be on his own line
PACKAGE_VERSION=$(cat package.json \
| grep version \
| head -1 \
| awk -F: '{ print $2 }' \
| sed 's/[",]//g')
echo $PACKAGE_VERSION
Code snippet source

Your better off using a custom script task (similar to what is described above). There is no component in Bamboo that provides this level of functionality out of the box.

Related

How does cmake print the path of the header file of the library the project depends on?

I want cmake to output the path of the header file of the library that the project depends on, and give it to ctags to generate tags.
I have tried to generate tags of all header files of the system directly: ctags -R /usr/include, but the size of the generated tags file is 190MB, which is too large.
For example, if libcurl is used in the project, then let cmake output /usr/include/curl, and then ctags can ctags -R /usr/include/curl.
I looked at cmake --help, but didn't find what I was looking for. How can I achieve this?
Generate compile_commands.json. Parse compile_commands.json, extract all "command": keys, extract all -I<this paths> include paths from compile commands, interpret them relative to build directory. sort -u the list.
$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ...
$ jq -r '.[] | .command' "$builddir"/compile_commands.json |
grep -o -- '-I[^ ]*' |
sed 's/^-I//' |
sort -u |
( cd "$builddir" && xargs -d '\n' readlink -f ) |
sort -u

How to modify sed awk command to work with relative path

Context
I had a SO question successfully answered at https://stackoverflow.com/a/59244265/80353
I have successfully used the command that was given.
cap()(cd /tmp;rm -f *.vtt;youtube-dl --skip-download --write-auto-sub "$1";\
sed '1,/^$/d' *.vtt|sed 's/<[^>]*>//g'|awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3'\
|tee -a "$2")
What does this command do?
This command will download captions for a youtube video as a .vtt file from $1 parameter
then print out the simplified version of the .vtt file into another file that's stated as parameter $2
This works as advertised.
How to call the command
In the terminal I will run the above command once and then run cap $youtube_url $full_path_to_output_file
What changes I would like
Currently, the $2 parameter must be a full path. Also currently, if the $2 parameter doesn't exist, an actual file will be created. What I would like is this behavior remains even for relative path. So hopefully for relative path, this behavior of creating a new empty file still works.
Update
I see that comments are such that there's nothing wrong with the command.
However, I did try running
cap $youtube_url $relative_path_to_a_text_file and it definitely did not work for me in macOS
Perhaps I am missing something else?
Update 2
This is a video of me running the awk sed command . First I did it with just a relative path. No output file shows up in the current working directory. The second shows me typing the full path and it works.
https://www.loom.com/share/1c179506fa5b48b4a3d62c81a9d2a411
I hope this clarifies the question i am raising and the commenters would kindly update their comments based on this video.
EDIT: Adding a solution after OP's comment which do checks inside OP's function itself, warning not tested it though.
cap()(
user_path=$(echo "$path_details" | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH)}')
path_details="$2"
PWD=`pwd`
cd "$PWD"
user_path=$(echo "$path_details" | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH)}')
if [[ -d "$user_path" ]]
then
echo "Present path $user_path."
##Call your program here....##
cd /tmp;rm -f *.vtt;youtube-dl --skip-download --write-auto-sub "$1";\
sed '1,/^$/d' *.vtt|sed 's/<[^>]*>//g'|awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3'\
|tee -a "$2"
else
echo "NOT present path $user_path."
##Can exit from here. if needed.##
fi
)
I believe OP wants to check directory of relative path passed as 2nd argument, is present or not, if this is the case then one could try following.
cat file.ksh
path_details="$2"
PWD=`pwd`
##Why I am going to your path is, in case you are running this from cron, so in that case you can mention complete path here, rather than pwd as mentioned above.
cd "$PWD"
user_path=$(echo "$path_details" | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH)}')
if [[ -d "$user_path" ]]
then
echo "Present path $user_path."
##Call your program here....##
else
echo "NOT present path $user_path."
##Can exit from here. if needed.##
fi
Explanation: Adding detailed explanation for above code.
cat file.ksh ##For OP reference to show content I am using cat script_name here.
path_details="$2" ##Creating variable path_details whose value is $2(2nd argument passed to script)
PWD=`pwd` ##Creating variable PWD whose value is pwd(current working directory).
##Why I am going to your path is, in case you are running this from cron, so in that case you can mention complete path here, rather than pwd as mentioned above.
cd "$PWD" ##Going to current directory, why I did is you can set PWD above variable value as per your need and navigate to that path, this will help in case of script is running from Cron.
user_path=$(echo "$path_details" | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH)}') ##Now getting path details from passed 2nd argument for script.
if [[ -d "$user_path" ]] ##Checking if user_path(path value is existing on system)
then
echo "Present path $user_path."
##Call your program here....## ##If path existing then call your program.
else ##If path NOT existing then exit from program or print message up to you :)
echo "NOT present path $user_path."
##Can exit from here. if needed.##
fi ##Closing if condition here.

How to format code using IntelliJ format using a precommit hook?

I'm trying to configure a precommit hook to automatically format the code using IntelliJ code formatter.
Indeed, IntelliJ permit to run the formatter using the command line outside the IDE: https://www.jetbrains.com/help/idea/command-line-formatter.html
So I've created my precommit file:
git diff --name-only --cached --diff-filter=ACM | xargs -L 1 format
So to run format on each staged file. The problem is when I try to execute this command, the IDE shows an error message:
Message: Only one instance of IDEA can be run at a time.
Do you have an idea how to run format outside the IDE even leaving the IDE open?
You can automate the required instructions to allow running a separate instance:
cat >/tmp/format.properties <<EOF
idea.config.path=\${user.home}/.IntelliJIdea/format/config
idea.system.path=\${user.home}/.IntelliJIdea/format/system
EOF
git diff --name-only --cached --diff-filter=ACM | xargs env IDEA_PROPERTIES=/tmp/format.properties format
/tmp/format.properties: idea.properties location changes after each upgrade of IntelliJ.
In my case, I also retrieve format.sh location from idea command:
format_command=$(grep idea.sh $(which idea)|sed "s,idea.sh,format.sh,")
eval "env IDEA_PROPERTIES=/tmp/format.properties $format_command $(git diff --name-only --cached --diff-filter=ACM|xargs)"

Cannot resolve com.google.caliper.BeforeExperiment

I git clone souce code from code.google.com
when i set guava-tests module benchmark as maven source root ,but it's also error
how to solve it?
see the picture
follow Frank advice I change to bechmark maked as a "Test Source Root"
but the Idea dislplay can't resolve symbol BeforeExperiment,but my .m2/repository
has the jar .see the first screenshot.
when i exec ,the result is below ,it is empty.
caliper jar tf 1.0-beta-1/caliper-1.0-beta-1.jar|grep -E com.google.caliper.BeforeExperiment |sort
caliper jar tf 0.5-rc1/caliper-0.5-rc1.jar|grep -E com.google.caliper.BeforeExperiment |sort
caliper jar tf 1.0-beta-1/caliper-1.0-beta-1.jar|grep -E com.google.caliper.BeforeExperiment |sort
The guava-tests/benchmark directory is currently not set as a source root in the Maven configuration because it won't build. That said, we just need to push a new version of Caliper to Maven Central that includes the new annotations and such, and I think that should be happening sometime soon.
No publicly available version of Caliper contains the com.google.caliper.BeforeExperiment class.
You can compare the result of the following class searches on search.maven.org for yourself:
com.google.caliper.BeforeExperiment
com.google.caliper.Benchmark
You can also check what's in your jar:
$ jar tf ~/.m2/repository/com/google/caliper/caliper/0.5-rc1/caliper-0.5-rc1.jar | \
grep -E com.google.caliper.B | sort
com/google/caliper/Benchmark.class
$
Or using the most recent "release" of Caliper:
$ jar tf caliper-1.0-beta-1.jar | grep -E com.google.caliper.B | sort
com/google/caliper/Benchmark.class
$

How to detect code change frequency?

I am working on a program written by several folks with largely varying skill level. There are files in there that have never changed (and probably never will, as we're afraid to touch them) and others that are changing constantly.
I wonder, are there any tools out there that would look at the entire repo history (git) and produce analysis on how frequently a given file changes? Or package? Or project?
It would be of value to recognize that (for example) we spent 25% of our time working on a set of packages, which would be indicative or code's fragility, as compared with code that "just works".
If you're looking for an OS solution, I'd probably consider starting with gitstats and look at extending it by grabbing file logs and aggregating that data.
I'd have a look at NChurn:
NChurn is a utility that helps asses the churn level of your files in
your repository. Churn can help you detect which files are changed the
most in their life time. This helps identify potential bug hives, and
improper design.The best thing to do is to plug NChurn into your build
process and store history of each run. Then, you can plot the
evolution of your repository's churn.
I wrote something that we use to visualize this information successfully.
https://github.com/bcarlso/defect-density-heatmap
Take a look at the project and you can see what the output looks like in the readme.
You can do what you need by first getting a list of files that have changed in each commit from Git.
~ $ git log --pretty="format:" --name-only | grep -v ^$ > file-changes.txt
~ $ for i in `cat file-changes.txt | cut -d"." -f1,2 | uniq`; do num=`cat file-changes.txt | grep $i | wc -l`; if (( $num > 1 )); then echo $num,0,$i; fi; done | heatmap > results.html
This will give you a tag cloud with files that churn more will show up larger.
I suggest using a command like
git log --follow -p file
That will give you all the changes that happened to the file in the history (including renames). If you want to get the number of commits that changed the file then you can do on a UNIX-based OS :
git log --follow --format=oneline Gemfile | wc -l
You can then create a bash script to apply this to multiple files with the name aside.
Hope it helped !
Building on a previous answer I suggest the following script to parse all project files
#!/bin/sh
cd $1
find . -path ./.git -prune -o -name "*" -exec sh -c 'git log --follow --format=oneline $1 | wc -l | awk "{ print \$1,\"\\t\",\"$1\" }" ' {} {} \; | sort -nr
cd ..
If you call the script as file_churn.sh you can parse your git project directory calling
> ./file_churn.sh project_dir
Hope it helps.