[ 
https://issues.apache.org/jira/browse/CASSANDRA-21704?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Michael Semb Wever updated CASSANDRA-21704:
-------------------------------------------
                     Complexity: Low Hanging Fruit
                  Fix Version/s: 6.0.x
                                 7.x
    Test and Documentation Plan: 
No JDK build ran; the change touches no Java and every site is shell, make or 
rpm text.

{{.build/sh/test/stub-ant-cases.sh}} was run before and after the change, and 
the same 19 of 64 cases fail either way. Those 19 fail on this machine for an 
unrelated reason, {{run-tests.sh}} exiting 126, so the suite proves no 
regression rather than proving the new code path.

The derivation was exercised directly against a {{build.xml}} renamed to 
{{dse-db}}, in each of its three languages: the shell expression, the {{$(shell 
…)}} in a makefile, and the classpath block of {{bin/cassandra.in.sh}} sourced 
against a tree holding {{build/dse-db-5.1-SNAPSHOT.jar}}, 
{{build/dse-db-5.1-SNAPSHOT-sources.jar}} and {{build/dtest-5.1.jar}}. All 
three answer {{dse-db}}, and the classpath block selects the one jar and 
ignores the sources jar and the dtest jar.

Two negative cases were checked. With no {{build.xml}} present the classpath 
block falls back to {{apache-cassandra}} and selects the same jar it selects 
today. And {{ls -1 build/*-[0-9]*.jar}} on that same tree returns both 
{{apache-cassandra-5.1-SNAPSHOT.jar}} and {{dtest-5.1.jar}}, which is why the 
globs derive the name instead of widening.

The debian and redhat package builds need {{ant artifacts}} in the build 
containers, so CI on this branch is what proves them.
                    Description: 
The jar and the source tarball are named after the {{<project name="…">}} 
attribute in {{build.xml}}, because ant builds 
{{build/${ant.project.name}-${version}.jar}}. Nine sites in the build and 
packaging scripts spell {{apache-cassandra}} instead:

{code:none}
.build/docker/_build-redhat.sh   rm -rf ${DIST_DIR}/apache-cassandra-*.jar
                                 cp ${DIST_DIR}/apache-cassandra-*-src.tar.gz …
.build/run-tests.sh              [[ -f 
"${DIST_DIR}/apache-cassandra-${version}.jar" ]] || …
.build/run-python-dtests.sh      the same check
.build/sh/test/stub-ant-cases.sh touch 
"${DIST_DIR}/apache-cassandra-${version}-SNAPSHOT.jar"
debian/rules                     dh_install 
$(BUILD_DIR)/apache-cassandra-$(VERSION).jar
redhat/cassandra.spec            %define relname 
apache-cassandra-%{upstream_version}
bin/cassandra.in.sh              ls -1 
$CASSANDRA_HOME/build/apache-cassandra*.jar
tools/bin/cassandra.in.sh        the same glob
redhat/cassandra.in.sh           the same glob
{code}

Rename the project and every one of them misses. The debian and redhat 
packaging cannot find the jar it just built, {{run-tests.sh}} reports {{Project 
must be built first}} against a tree that is built, and {{bin/cassandra}} 
constructs a classpath with no Cassandra jar on it.

The patch reads the name at each site, where that site already reads 
{{build.xml}}: beside the {{base.version}} line in the two test runners, beside 
{{buildxml_version}} in {{_build-redhat.sh}}, as a {{$(shell …)}} beside 
{{VERSION}} in {{debian/rules}}, and from {{$CASSANDRA_HOME/build.xml}} in the 
three {{cassandra.in.sh}} files, whose glob sits inside a {{[ -d 
$CASSANDRA_HOME/build ]}} test and therefore runs against a source checkout. 
One expression is used everywhere, {{grep '<project[[:space:]]*basedir=' 
build.xml | sed -ne 's/.*name="\([^"]*\)".*/\1/p'}}, with {{[[:space:]]}} 
rather than {{\s}} because {{bin/cassandra.in.sh}} also runs under the BSD grep 
on macOS.

{{redhat/cassandra.spec}} is the exception. It takes the name from 
{{_build-redhat.sh}} as an {{rpmbuild --define}}, beside the {{version}} and 
{{revision}} defines that call already passes, so the derivation stays in shell 
and the spec carries no second copy of the regular expression. The spec 
defaults to {{apache-cassandra}}, so {{rpmbuild -ba redhat/cassandra.spec}} run 
by hand behaves as it does today.

Three limits are deliberate. The debian symlink keeps the name 
{{apache-cassandra.jar}}: it is a published path, and only its target has to 
follow the rename, so {{debian/init}} needs no change either. The classpath 
globs derive the name rather than widening from {{apache-cassandra*.jar}} to 
{{*-[0-9]*.jar}}, which would also match a built {{dtest-<version>.jar}} and 
make the script refuse to start on "JAR artifacts for multiple versions". And 
{{_build-redhat.sh}} alone refuses an empty name, because it is the one site 
that hands the value to {{rm -rf}}.

Three sites are left alone: the sub-build names in {{.build/build-*.xml}}, 
which name ant projects rather than artifacts; the {{Conflicts}} and 
{{Replaces}} on {{apache-cassandra1}} in {{debian/control}}, which name a 
historical package; and {{toCopy}} in {{.jenkins/Jenkinsfile}}, which no code 
in the tree reads.

Nothing changes for a build that keeps the name {{apache-cassandra}}, which is 
every Apache build.

Patch: 
[mck/CASSANDRA-21704/trunk|https://github.com/thelastpickle/cassandra/tree/mck/CASSANDRA-21704/trunk]
Provenance: 
[2315d6f359|https://github.com/datastax/cassandra/commit/2315d6f359b963bb55c629c2416dc6f66903bf8f]
 by [~mck], in 
[datastax/cassandra#2193|https://github.com/datastax/cassandra/pull/2193], 
where the fork's project name is {{dse-db}}. That pull request covers five of 
these nine sites, and reaches the remaining fork needs by hardcoding {{dse-db}} 
in the two {{cassandra.in.sh}} files and by widening the redhat glob. This 
patch derives the name at all nine instead. The JDK 22 support and the docker 
back-ports in that pull request are fork-only and are not here.

  was:
The jar and the source tarball are named after the {{<project name="…">}} 
attribute in {{build.xml}}, because ant builds 
{{build/${ant.project.name}-${version}.jar}}. Nine sites in the build and 
packaging scripts spell {{apache-cassandra}} instead:

{code:none}
.build/docker/_build-redhat.sh   rm -rf ${DIST_DIR}/apache-cassandra-*.jar
                                 cp ${DIST_DIR}/apache-cassandra-*-src.tar.gz …
.build/run-tests.sh              [[ -f 
"${DIST_DIR}/apache-cassandra-${version}.jar" ]] || …
.build/run-python-dtests.sh      the same check
.build/sh/test/stub-ant-cases.sh touch 
"${DIST_DIR}/apache-cassandra-${version}-SNAPSHOT.jar"
debian/rules                     dh_install 
$(BUILD_DIR)/apache-cassandra-$(VERSION).jar
redhat/cassandra.spec            %define relname 
apache-cassandra-%{upstream_version}
bin/cassandra.in.sh              ls -1 
$CASSANDRA_HOME/build/apache-cassandra*.jar
tools/bin/cassandra.in.sh        the same glob
redhat/cassandra.in.sh           the same glob
{code}

Rename the project and every one of them misses. The debian and redhat 
packaging cannot find the jar it just built, {{run-tests.sh}} reports {{Project 
must be built first}} against a tree that is built, and {{bin/cassandra}} 
constructs a classpath with no Cassandra jar on it.

The patch reads the name at each site, where that site already reads 
{{build.xml}}: beside the {{base.version}} line in the two test runners, beside 
{{buildxml_version}} in {{_build-redhat.sh}}, as a {{$(shell …)}} beside 
{{VERSION}} in {{debian/rules}}, and from {{$CASSANDRA_HOME/build.xml}} in the 
three {{cassandra.in.sh}} files, whose glob sits inside a {{[ -d 
$CASSANDRA_HOME/build ]}} test and therefore runs against a source checkout. 
One expression is used everywhere, {{grep '<project[[:space:]]*basedir=' 
build.xml | sed -ne 's/.*name="\([^"]*\)".*/\1/p'}}, with {{[[:space:]]}} 
rather than {{\s}} because {{bin/cassandra.in.sh}} also runs under the BSD grep 
on macOS.

{{redhat/cassandra.spec}} is the exception. It takes the name from 
{{_build-redhat.sh}} as an {{rpmbuild --define}}, beside the {{version}} and 
{{revision}} defines that call already passes, so the derivation stays in shell 
and the spec carries no second copy of the regular expression. The spec 
defaults to {{apache-cassandra}}, so {{rpmbuild -ba redhat/cassandra.spec}} run 
by hand behaves as it does today.

Three limits are deliberate. The debian symlink keeps the name 
{{apache-cassandra.jar}}: it is a published path, and only its target has to 
follow the rename, so {{debian/init}} needs no change either. The classpath 
globs derive the name rather than widening from {{apache-cassandra*.jar}} to 
{{*-[0-9]*.jar}}, which would also match a built {{dtest-<version>.jar}} and 
make the script refuse to start on "JAR artifacts for multiple versions". And 
{{_build-redhat.sh}} alone refuses an empty name, because it is the one site 
that hands the value to {{rm -rf}}.

Three sites are left alone: the sub-build names in {{.build/build-*.xml}}, 
which name ant projects rather than artifacts; the {{Conflicts}} and 
{{Replaces}} on {{apache-cassandra1}} in {{debian/control}}, which name a 
historical package; and {{toCopy}} in {{.jenkins/Jenkinsfile}}, which no code 
in the tree reads.

Nothing changes for a build that keeps the name {{apache-cassandra}}, which is 
every Apache build.

Patch: 
[mck/upstream/packaging-project-name/trunk|https://github.com/thelastpickle/cassandra/tree/mck/upstream/packaging-project-name/trunk]
Provenance: 
[2315d6f359|https://github.com/datastax/cassandra/commit/2315d6f359b963bb55c629c2416dc6f66903bf8f]
 by [~mck], in 
[datastax/cassandra#2193|https://github.com/datastax/cassandra/pull/2193], 
where the fork's project name is {{dse-db}}. That pull request covers five of 
these nine sites, and reaches the remaining fork needs by hardcoding {{dse-db}} 
in the two {{cassandra.in.sh}} files and by widening the redhat glob. This 
patch derives the name at all nine instead. The JDK 22 support and the docker 
back-ports in that pull request are fork-only and are not here.

                       Priority: Low  (was: Normal)

> Make the packaging and build scripts follow the ant project name
> ----------------------------------------------------------------
>
>                 Key: CASSANDRA-21704
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-21704
>             Project: Apache Cassandra
>          Issue Type: Improvement
>          Components: Build, Packaging
>            Reporter: Michael Semb Wever
>            Priority: Low
>             Fix For: 6.0.x, 7.x
>
>
> The jar and the source tarball are named after the {{<project name="…">}} 
> attribute in {{build.xml}}, because ant builds 
> {{build/${ant.project.name}-${version}.jar}}. Nine sites in the build and 
> packaging scripts spell {{apache-cassandra}} instead:
> {code:none}
> .build/docker/_build-redhat.sh   rm -rf ${DIST_DIR}/apache-cassandra-*.jar
>                                  cp ${DIST_DIR}/apache-cassandra-*-src.tar.gz 
> …
> .build/run-tests.sh              [[ -f 
> "${DIST_DIR}/apache-cassandra-${version}.jar" ]] || …
> .build/run-python-dtests.sh      the same check
> .build/sh/test/stub-ant-cases.sh touch 
> "${DIST_DIR}/apache-cassandra-${version}-SNAPSHOT.jar"
> debian/rules                     dh_install 
> $(BUILD_DIR)/apache-cassandra-$(VERSION).jar
> redhat/cassandra.spec            %define relname 
> apache-cassandra-%{upstream_version}
> bin/cassandra.in.sh              ls -1 
> $CASSANDRA_HOME/build/apache-cassandra*.jar
> tools/bin/cassandra.in.sh        the same glob
> redhat/cassandra.in.sh           the same glob
> {code}
> Rename the project and every one of them misses. The debian and redhat 
> packaging cannot find the jar it just built, {{run-tests.sh}} reports 
> {{Project must be built first}} against a tree that is built, and 
> {{bin/cassandra}} constructs a classpath with no Cassandra jar on it.
> The patch reads the name at each site, where that site already reads 
> {{build.xml}}: beside the {{base.version}} line in the two test runners, 
> beside {{buildxml_version}} in {{_build-redhat.sh}}, as a {{$(shell …)}} 
> beside {{VERSION}} in {{debian/rules}}, and from 
> {{$CASSANDRA_HOME/build.xml}} in the three {{cassandra.in.sh}} files, whose 
> glob sits inside a {{[ -d $CASSANDRA_HOME/build ]}} test and therefore runs 
> against a source checkout. One expression is used everywhere, {{grep 
> '<project[[:space:]]*basedir=' build.xml | sed -ne 
> 's/.*name="\([^"]*\)".*/\1/p'}}, with {{[[:space:]]}} rather than {{\s}} 
> because {{bin/cassandra.in.sh}} also runs under the BSD grep on macOS.
> {{redhat/cassandra.spec}} is the exception. It takes the name from 
> {{_build-redhat.sh}} as an {{rpmbuild --define}}, beside the {{version}} and 
> {{revision}} defines that call already passes, so the derivation stays in 
> shell and the spec carries no second copy of the regular expression. The spec 
> defaults to {{apache-cassandra}}, so {{rpmbuild -ba redhat/cassandra.spec}} 
> run by hand behaves as it does today.
> Three limits are deliberate. The debian symlink keeps the name 
> {{apache-cassandra.jar}}: it is a published path, and only its target has to 
> follow the rename, so {{debian/init}} needs no change either. The classpath 
> globs derive the name rather than widening from {{apache-cassandra*.jar}} to 
> {{*-[0-9]*.jar}}, which would also match a built {{dtest-<version>.jar}} and 
> make the script refuse to start on "JAR artifacts for multiple versions". And 
> {{_build-redhat.sh}} alone refuses an empty name, because it is the one site 
> that hands the value to {{rm -rf}}.
> Three sites are left alone: the sub-build names in {{.build/build-*.xml}}, 
> which name ant projects rather than artifacts; the {{Conflicts}} and 
> {{Replaces}} on {{apache-cassandra1}} in {{debian/control}}, which name a 
> historical package; and {{toCopy}} in {{.jenkins/Jenkinsfile}}, which no code 
> in the tree reads.
> Nothing changes for a build that keeps the name {{apache-cassandra}}, which 
> is every Apache build.
> Patch: 
> [mck/CASSANDRA-21704/trunk|https://github.com/thelastpickle/cassandra/tree/mck/CASSANDRA-21704/trunk]
> Provenance: 
> [2315d6f359|https://github.com/datastax/cassandra/commit/2315d6f359b963bb55c629c2416dc6f66903bf8f]
>  by [~mck], in 
> [datastax/cassandra#2193|https://github.com/datastax/cassandra/pull/2193], 
> where the fork's project name is {{dse-db}}. That pull request covers five of 
> these nine sites, and reaches the remaining fork needs by hardcoding 
> {{dse-db}} in the two {{cassandra.in.sh}} files and by widening the redhat 
> glob. This patch derives the name at all nine instead. The JDK 22 support and 
> the docker back-ports in that pull request are fork-only and are not here.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to