src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebBundler.java
author herrick
Wed, 16 Oct 2019 09:57:23 -0400
branchJDK-8200758-branch
changeset 58647 2c43b89b1679
parent 58417 67ffaf3a2b75
child 58696 61c44899b4eb
permissions -rw-r--r--
8231862: Decouple DesktopIntegration and LinuxPackageBundler classes Submitted-by: asemenyuk Reviewed-by: aherrick, almatvee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
     1
/*
57106
ea870b9ce89a 8216492: Update copyright of all new jpackage fils to 2019
kcr
parents: 57103
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
     4
 *
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    10
 *
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    15
 * accompanied this code).
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    16
 *
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    20
 *
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    23
 * questions.
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    24
 */
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    25
57039
98d3963b0b7b 8214051: rename jpackager tool to jpackage
herrick
parents: 57038
diff changeset
    26
package jdk.jpackage.internal;
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    27
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    28
import java.io.*;
57807
4a15115716ea 8215381: Investigate if current implementation of --license-file is correct for Debian packages
herrick
parents: 57790
diff changeset
    29
import java.nio.charset.StandardCharsets;
57808
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
    30
import java.nio.file.FileVisitResult;
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    31
import java.nio.file.Files;
57807
4a15115716ea 8215381: Investigate if current implementation of --license-file is correct for Debian packages
herrick
parents: 57790
diff changeset
    32
import java.nio.file.Path;
57808
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
    33
import java.nio.file.SimpleFileVisitor;
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
    34
import java.nio.file.attribute.BasicFileAttributes;
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
    35
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    36
import java.nio.file.attribute.PosixFilePermission;
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    37
import java.nio.file.attribute.PosixFilePermissions;
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    38
import java.text.MessageFormat;
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    39
import java.util.*;
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    40
import java.util.regex.Matcher;
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    41
import java.util.regex.Pattern;
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    42
import java.util.stream.Collectors;
57807
4a15115716ea 8215381: Investigate if current implementation of --license-file is correct for Debian packages
herrick
parents: 57790
diff changeset
    43
import java.util.stream.Stream;
58303
88453b906981 8231279 : Change install location for copyright file for Debian package
herrick
parents: 58301
diff changeset
    44
import static jdk.jpackage.internal.LinuxAppBundler.LINUX_INSTALL_DIR;
58647
2c43b89b1679 8231862: Decouple DesktopIntegration and LinuxPackageBundler classes
herrick
parents: 58417
diff changeset
    45
import static jdk.jpackage.internal.OverridableResource.createResource;
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    46
57039
98d3963b0b7b 8214051: rename jpackager tool to jpackage
herrick
parents: 57038
diff changeset
    47
import static jdk.jpackage.internal.StandardBundlerParam.*;
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    48
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    49
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
    50
public class LinuxDebBundler extends LinuxPackageBundler {
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    51
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    52
    // Debian rules for package naming are used here
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    53
    // https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Source
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    54
    //
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    55
    // Package names must consist only of lower case letters (a-z),
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    56
    // digits (0-9), plus (+) and minus (-) signs, and periods (.).
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    57
    // They must be at least two characters long and
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    58
    // must start with an alphanumeric character.
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    59
    //
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
    60
    private static final Pattern DEB_PACKAGE_NAME_PATTERN =
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    61
            Pattern.compile("^[a-z][a-z\\d\\+\\-\\.]+");
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    62
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
    63
    private static final BundlerParamInfo<String> PACKAGE_NAME =
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    64
            new StandardBundlerParam<> (
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    65
            Arguments.CLIOptions.LINUX_BUNDLE_NAME.getId(),
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    66
            String.class,
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    67
            params -> {
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    68
                String nm = APP_NAME.fetchFrom(params);
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    69
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    70
                if (nm == null) return null;
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    71
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    72
                // make sure to lower case and spaces/underscores become dashes
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    73
                nm = nm.toLowerCase().replaceAll("[ _]", "-");
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    74
                return nm;
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    75
            },
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    76
            (s, p) -> {
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
    77
                if (!DEB_PACKAGE_NAME_PATTERN.matcher(s).matches()) {
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    78
                    throw new IllegalArgumentException(new ConfigException(
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    79
                            MessageFormat.format(I18N.getString(
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    80
                            "error.invalid-value-for-package-name"), s),
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    81
                            I18N.getString(
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    82
                            "error.invalid-value-for-package-name.advice")));
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    83
                }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    84
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    85
                return s;
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    86
            });
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
    87
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    88
    private final static String TOOL_DPKG_DEB = "dpkg-deb";
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    89
    private final static String TOOL_DPKG = "dpkg";
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    90
    private final static String TOOL_FAKEROOT = "fakeroot";
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    91
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    92
    private final static String DEB_ARCH;
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    93
    static {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    94
        String debArch;
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    95
        try {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    96
            debArch = Executor.of(TOOL_DPKG, "--print-architecture").saveOutput(
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    97
                    true).executeExpectSuccess().getOutput().get(0);
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    98
        } catch (IOException ex) {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
    99
            debArch = null;
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   100
        }
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   101
        DEB_ARCH = debArch;
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   102
    }
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   103
57910
28412b313c6b 8228660: .deb files generated by jpackage don't follow naming convention
herrick
parents: 57908
diff changeset
   104
    private static final BundlerParamInfo<String> FULL_PACKAGE_NAME =
28412b313c6b 8228660: .deb files generated by jpackage don't follow naming convention
herrick
parents: 57908
diff changeset
   105
            new StandardBundlerParam<>(
28412b313c6b 8228660: .deb files generated by jpackage don't follow naming convention
herrick
parents: 57908
diff changeset
   106
                    "linux.deb.fullPackageName", String.class, params -> {
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   107
                        return PACKAGE_NAME.fetchFrom(params)
57910
28412b313c6b 8228660: .deb files generated by jpackage don't follow naming convention
herrick
parents: 57908
diff changeset
   108
                            + "_" + VERSION.fetchFrom(params)
28412b313c6b 8228660: .deb files generated by jpackage don't follow naming convention
herrick
parents: 57908
diff changeset
   109
                            + "-" + RELEASE.fetchFrom(params)
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   110
                            + "_" + DEB_ARCH;
57910
28412b313c6b 8228660: .deb files generated by jpackage don't follow naming convention
herrick
parents: 57908
diff changeset
   111
                    }, (s, p) -> s);
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   112
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   113
    private static final BundlerParamInfo<String> EMAIL =
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   114
            new StandardBundlerParam<> (
57255
f686bda3b831 8215574: Investigate and document usage of --category, --copyright, --vendor and --description
herrick
parents: 57150
diff changeset
   115
            Arguments.CLIOptions.LINUX_DEB_MAINTAINER.getId(),
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   116
            String.class,
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   117
            params -> "Unknown",
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   118
            (s, p) -> s);
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   119
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   120
    private static final BundlerParamInfo<String> MAINTAINER =
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   121
            new StandardBundlerParam<> (
57255
f686bda3b831 8215574: Investigate and document usage of --category, --copyright, --vendor and --description
herrick
parents: 57150
diff changeset
   122
            BundleParams.PARAM_MAINTAINER,
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   123
            String.class,
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   124
            params -> VENDOR.fetchFrom(params) + " <"
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   125
                    + EMAIL.fetchFrom(params) + ">",
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   126
            (s, p) -> s);
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   127
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   128
    private static final BundlerParamInfo<String> SECTION =
57790
1ea531646100 8213941: Debian linux problems in JavaPackager
herrick
parents: 57741
diff changeset
   129
            new StandardBundlerParam<>(
1ea531646100 8213941: Debian linux problems in JavaPackager
herrick
parents: 57741
diff changeset
   130
            Arguments.CLIOptions.LINUX_CATEGORY.getId(),
1ea531646100 8213941: Debian linux problems in JavaPackager
herrick
parents: 57741
diff changeset
   131
            String.class,
1ea531646100 8213941: Debian linux problems in JavaPackager
herrick
parents: 57741
diff changeset
   132
            params -> "misc",
1ea531646100 8213941: Debian linux problems in JavaPackager
herrick
parents: 57741
diff changeset
   133
            (s, p) -> s);
57807
4a15115716ea 8215381: Investigate if current implementation of --license-file is correct for Debian packages
herrick
parents: 57790
diff changeset
   134
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   135
    private static final BundlerParamInfo<String> LICENSE_TEXT =
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   136
            new StandardBundlerParam<> (
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   137
            "linux.deb.licenseText",
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   138
            String.class,
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   139
            params -> {
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   140
                try {
57080
bd4ce7f9ea2c 8214495: Change behavior of --license-file
herrick
parents: 57067
diff changeset
   141
                    String licenseFile = LICENSE_FILE.fetchFrom(params);
bd4ce7f9ea2c 8214495: Change behavior of --license-file
herrick
parents: 57067
diff changeset
   142
                    if (licenseFile != null) {
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   143
                        return Files.lines(Path.of(licenseFile),
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   144
                                StandardCharsets.UTF_8).collect(
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   145
                                        Collectors.joining("\n"));
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   146
                    }
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   147
                } catch (IOException e) {
57140
3dcb33ce7ced 8217751: jpackage messages and failures
herrick
parents: 57119
diff changeset
   148
                    Log.verbose(e);
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   149
                }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   150
                return "Unknown";
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   151
            },
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   152
            (s, p) -> s);
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   153
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   154
    public LinuxDebBundler() {
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   155
        super(PACKAGE_NAME);
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   156
    }
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   157
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   158
    @Override
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   159
    public void doValidate(Map<String, ? super Object> params)
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   160
            throws ConfigException {
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   161
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   162
        // Show warning if license file is missing
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   163
        if (LICENSE_FILE.fetchFrom(params) == null) {
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   164
            Log.verbose(I18N.getString("message.debs-like-licenses"));
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   165
        }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   166
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   167
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   168
    @Override
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   169
    protected List<ToolValidator> getToolValidators(
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   170
            Map<String, ? super Object> params) {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   171
        return Stream.of(TOOL_DPKG_DEB, TOOL_DPKG, TOOL_FAKEROOT).map(
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   172
                ToolValidator::new).collect(Collectors.toList());
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   173
    }
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   174
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   175
    @Override
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   176
    protected File buildPackageBundle(
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   177
            Map<String, String> replacementData,
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   178
            Map<String, ? super Object> params, File outputParentDir) throws
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   179
            PackagerException, IOException {
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   180
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   181
        prepareProjectConfig(replacementData, params);
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   182
        adjustPermissionsRecursive(createMetaPackage(params).sourceRoot().toFile());
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   183
        return buildDeb(params, outputParentDir);
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   184
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   185
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   186
    private static final Pattern PACKAGE_NAME_REGEX = Pattern.compile("^(^\\S+):");
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   187
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   188
    @Override
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   189
    protected void initLibProvidersLookup(
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   190
            Map<String, ? super Object> params,
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   191
            LibProvidersLookup libProvidersLookup) {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   192
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   193
        //
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   194
        // `dpkg -S` command does glob pattern lookup. If not the absolute path
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   195
        // to the file is specified it might return mltiple package names.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   196
        // Even for full paths multiple package names can be returned as
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   197
        // it is OK for multiple packages to provide the same file. `/opt`
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   198
        // directory is such an example. So we have to deal with multiple
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   199
        // packages per file situation.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   200
        //
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   201
        // E.g.: `dpkg -S libc.so.6` command reports three packages:
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   202
        // libc6-x32: /libx32/libc.so.6
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   203
        // libc6:amd64: /lib/x86_64-linux-gnu/libc.so.6
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   204
        // libc6-i386: /lib32/libc.so.6
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   205
        // `:amd64` is architecture suffix and can (should) be dropped.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   206
        // Still need to decide what package to choose from three.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   207
        // libc6-x32 and libc6-i386 both depend on libc6:
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   208
        // $ dpkg -s libc6-x32
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   209
        // Package: libc6-x32
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   210
        // Status: install ok installed
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   211
        // Priority: optional
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   212
        // Section: libs
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   213
        // Installed-Size: 10840
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   214
        // Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   215
        // Architecture: amd64
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   216
        // Source: glibc
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   217
        // Version: 2.23-0ubuntu10
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   218
        // Depends: libc6 (= 2.23-0ubuntu10)
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   219
        //
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   220
        // We can dive into tracking dependencies, but this would be overly
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   221
        // complicated.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   222
        //
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   223
        // For simplicity lets consider the following rules:
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   224
        // 1. If there is one item in `dpkg -S` output, accept it.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   225
        // 2. If there are multiple items in `dpkg -S` output and there is at
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   226
        //  least one item with the default arch suffix (DEB_ARCH),
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   227
        //  accept only these items.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   228
        // 3. If there are multiple items in `dpkg -S` output and there are
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   229
        //  no with the default arch suffix (DEB_ARCH), accept all items.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   230
        // So lets use this heuristics: don't accept packages for whom
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   231
        //  `dpkg -p` command fails.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   232
        // 4. Arch suffix should be stripped from accepted package names.
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   233
        //
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   234
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   235
        libProvidersLookup.setPackageLookup(file -> {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   236
            Set<String> archPackages = new HashSet<>();
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   237
            Set<String> otherPackages = new HashSet<>();
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   238
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   239
            Executor.of(TOOL_DPKG, "-S", file.toString())
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   240
                    .saveOutput(true).executeExpectSuccess()
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   241
                    .getOutput().forEach(line -> {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   242
                        Matcher matcher = PACKAGE_NAME_REGEX.matcher(line);
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   243
                        if (matcher.find()) {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   244
                            String name = matcher.group(1);
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   245
                            if (name.endsWith(":" + DEB_ARCH)) {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   246
                                // Strip arch suffix
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   247
                                name = name.substring(0,
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   248
                                        name.length() - (DEB_ARCH.length() + 1));
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   249
                                archPackages.add(name);
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   250
                            } else {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   251
                                otherPackages.add(name);
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   252
                            }
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   253
                        }
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   254
                    });
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   255
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   256
            if (!archPackages.isEmpty()) {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   257
                return archPackages.stream();
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   258
            }
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   259
            return otherPackages.stream();
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   260
        });
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   261
    }
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   262
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   263
    /*
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   264
     * set permissions with a string like "rwxr-xr-x"
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   265
     *
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   266
     * This cannot be directly backport to 22u which is built with 1.6
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   267
     */
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   268
    private void setPermissions(File file, String permissions) {
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   269
        Set<PosixFilePermission> filePermissions =
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   270
                PosixFilePermissions.fromString(permissions);
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   271
        try {
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   272
            if (file.exists()) {
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   273
                Files.setPosixFilePermissions(file.toPath(), filePermissions);
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   274
            }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   275
        } catch (IOException ex) {
57392
46d4b0aa4542 8223241: jpackage cleanup from code review
herrick
parents: 57391
diff changeset
   276
            Log.error(ex.getMessage());
46d4b0aa4542 8223241: jpackage cleanup from code review
herrick
parents: 57391
diff changeset
   277
            Log.verbose(ex);
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   278
        }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   279
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   280
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   281
58114
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   282
    public static boolean isDebian() {
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   283
        // we are just going to run "dpkg -s coreutils" and assume Debian
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   284
        // or deritive if no error is returned.
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   285
        try {
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   286
            Executor.of(TOOL_DPKG, "-s", "coreutils").executeExpectSuccess();
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   287
            return true;
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   288
        } catch (IOException e) {
58114
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   289
            // just fall thru
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   290
        }
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   291
        return false;
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   292
    }
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   293
57808
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   294
    private void adjustPermissionsRecursive(File dir) throws IOException {
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   295
        Files.walkFileTree(dir.toPath(), new SimpleFileVisitor<Path>() {
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   296
            @Override
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   297
            public FileVisitResult visitFile(Path file,
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   298
                    BasicFileAttributes attrs)
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   299
                    throws IOException {
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   300
                if (file.endsWith(".so") || !Files.isExecutable(file)) {
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   301
                    setPermissions(file.toFile(), "rw-r--r--");
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   302
                } else if (Files.isExecutable(file)) {
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   303
                    setPermissions(file.toFile(), "rwxr-xr-x");
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   304
                }
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   305
                return FileVisitResult.CONTINUE;
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   306
            }
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   307
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   308
            @Override
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   309
            public FileVisitResult postVisitDirectory(Path dir, IOException e)
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   310
                    throws IOException {
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   311
                if (e == null) {
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   312
                    setPermissions(dir.toFile(), "rwxr-xr-x");
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   313
                    return FileVisitResult.CONTINUE;
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   314
                } else {
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   315
                    // directory iteration failed
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   316
                    throw e;
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   317
                }
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   318
            }
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   319
        });
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   320
    }
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   321
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   322
    private class DebianFile {
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   323
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   324
        DebianFile(Path dstFilePath, String comment) {
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   325
            this.dstFilePath = dstFilePath;
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   326
            this.comment = comment;
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   327
        }
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   328
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   329
        DebianFile setExecutable() {
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   330
            permissions = "rwxr-xr-x";
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   331
            return this;
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   332
        }
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   333
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   334
        void create(Map<String, String> data, Map<String, ? super Object> params)
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   335
                throws IOException {
58647
2c43b89b1679 8231862: Decouple DesktopIntegration and LinuxPackageBundler classes
herrick
parents: 58417
diff changeset
   336
            createResource("template." + dstFilePath.getFileName().toString(),
2c43b89b1679 8231862: Decouple DesktopIntegration and LinuxPackageBundler classes
herrick
parents: 58417
diff changeset
   337
                    params)
2c43b89b1679 8231862: Decouple DesktopIntegration and LinuxPackageBundler classes
herrick
parents: 58417
diff changeset
   338
                    .setCategory(I18N.getString(comment))
2c43b89b1679 8231862: Decouple DesktopIntegration and LinuxPackageBundler classes
herrick
parents: 58417
diff changeset
   339
                    .setSubstitutionData(data)
2c43b89b1679 8231862: Decouple DesktopIntegration and LinuxPackageBundler classes
herrick
parents: 58417
diff changeset
   340
                    .saveToFile(dstFilePath);
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   341
            if (permissions != null) {
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   342
                setPermissions(dstFilePath.toFile(), permissions);
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   343
            }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   344
        }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   345
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   346
        private final Path dstFilePath;
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   347
        private final String comment;
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   348
        private String permissions;
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   349
    }
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   350
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   351
    private void prepareProjectConfig(Map<String, String> data,
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   352
            Map<String, ? super Object> params) throws IOException {
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   353
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   354
        Path configDir = createMetaPackage(params).sourceRoot().resolve("DEBIAN");
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   355
        List<DebianFile> debianFiles = new ArrayList<>();
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   356
        debianFiles.add(new DebianFile(
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   357
                configDir.resolve("control"),
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   358
                "resource.deb-control-file"));
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   359
        debianFiles.add(new DebianFile(
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   360
                configDir.resolve("preinst"),
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   361
                "resource.deb-preinstall-script").setExecutable());
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   362
        debianFiles.add(new DebianFile(
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   363
                configDir.resolve("prerm"),
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   364
                "resource.deb-prerm-script").setExecutable());
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   365
        debianFiles.add(new DebianFile(
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   366
                configDir.resolve("postinst"),
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   367
                "resource.deb-postinstall-script").setExecutable());
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   368
        debianFiles.add(new DebianFile(
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   369
                configDir.resolve("postrm"),
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   370
                "resource.deb-postrm-script").setExecutable());
58304
7a61351edad2 8231282 : Revisit --linux-deb-copyright option
herrick
parents: 58303
diff changeset
   371
        debianFiles.add(new DebianFile(
7a61351edad2 8231282 : Revisit --linux-deb-copyright option
herrick
parents: 58303
diff changeset
   372
                getConfig_CopyrightFile(params).toPath(),
7a61351edad2 8231282 : Revisit --linux-deb-copyright option
herrick
parents: 58303
diff changeset
   373
                "resource.copyright-file"));
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   374
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   375
        for (DebianFile debianFile : debianFiles) {
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   376
            debianFile.create(data, params);
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   377
        }
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   378
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   379
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   380
    @Override
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   381
    protected Map<String, String> createReplacementData(
57543
bcd1ab268a7d 8222778: Packaging Tool (JEP 343) on Linux/AArch64
dchuyko
parents: 57438
diff changeset
   382
            Map<String, ? super Object> params) throws IOException {
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   383
        Map<String, String> data = new HashMap<>();
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   384
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   385
        data.put("APPLICATION_MAINTAINER", MAINTAINER.fetchFrom(params));
57790
1ea531646100 8213941: Debian linux problems in JavaPackager
herrick
parents: 57741
diff changeset
   386
        data.put("APPLICATION_SECTION", SECTION.fetchFrom(params));
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   387
        data.put("APPLICATION_COPYRIGHT", COPYRIGHT.fetchFrom(params));
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   388
        data.put("APPLICATION_LICENSE_TEXT", LICENSE_TEXT.fetchFrom(params));
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   389
        data.put("APPLICATION_ARCH", DEB_ARCH);
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   390
        data.put("APPLICATION_INSTALLED_SIZE", Long.toString(
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   391
                createMetaPackage(params).sourceApplicationLayout().sizeInBytes() >> 10));
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   392
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   393
        return data;
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   394
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   395
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   396
    private File getConfig_CopyrightFile(Map<String, ? super Object> params) {
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   397
        PlatformPackage thePackage = createMetaPackage(params);
58303
88453b906981 8231279 : Change install location for copyright file for Debian package
herrick
parents: 58301
diff changeset
   398
        return thePackage.sourceRoot().resolve(Path.of(".",
88453b906981 8231279 : Change install location for copyright file for Debian package
herrick
parents: 58301
diff changeset
   399
                LINUX_INSTALL_DIR.fetchFrom(params), PACKAGE_NAME.fetchFrom(
88453b906981 8231279 : Change install location for copyright file for Debian package
herrick
parents: 58301
diff changeset
   400
                params), "share/doc/copyright")).toFile();
57808
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   401
    }
013547ae70ac 8225447: Revise Debian packaging
herrick
parents: 57807
diff changeset
   402
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   403
    private File buildDeb(Map<String, ? super Object> params,
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   404
            File outdir) throws IOException {
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   405
        File outFile = new File(outdir,
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   406
                FULL_PACKAGE_NAME.fetchFrom(params)+".deb");
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   407
        Log.verbose(MessageFormat.format(I18N.getString(
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   408
                "message.outputting-to-location"), outFile.getAbsolutePath()));
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   409
58301
e0efb29609bd 8225249 : LinuxDebBundler and LinuxRpmBundler should share more code
herrick
parents: 58116
diff changeset
   410
        PlatformPackage thePackage = createMetaPackage(params);
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   411
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   412
        List<String> cmdline = new ArrayList<>();
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   413
        cmdline.addAll(List.of(TOOL_FAKEROOT, TOOL_DPKG_DEB));
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   414
        if (Log.isVerbose()) {
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   415
            cmdline.add("--verbose");
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   416
        }
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   417
        cmdline.addAll(List.of("-b", thePackage.sourceRoot().toString(),
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   418
                outFile.getAbsolutePath()));
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   419
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   420
        // run dpkg
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   421
        Executor.of(cmdline.toArray(String[]::new)).executeExpectSuccess();
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   422
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   423
        Log.verbose(MessageFormat.format(I18N.getString(
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   424
                "message.output-to-location"), outFile.getAbsolutePath()));
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   425
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   426
        return outFile;
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   427
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   428
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   429
    @Override
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   430
    public String getName() {
57059
9bb2a4dc3af7 8214143: Reduce Resource files
herrick
parents: 57039
diff changeset
   431
        return I18N.getString("deb.bundler.name");
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   432
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   433
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   434
    @Override
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   435
    public String getID() {
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   436
        return "deb";
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   437
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   438
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   439
    @Override
57150
fa68c2ab636d 8217894: jpackage CLI syntax changes
herrick
parents: 57140
diff changeset
   440
    public boolean supported(boolean runtimeInstaller) {
58417
67ffaf3a2b75 8231280: Linux packages produced by jpackage should have correct dependencies
herrick
parents: 58304
diff changeset
   441
        return Platform.isLinux() && (new ToolValidator(TOOL_DPKG_DEB).validate() == null);
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   442
    }
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   443
58114
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   444
    @Override
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   445
    public boolean isDefault() {
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   446
        return isDebian();
42df7de58e39 8230519: jpackage "--package-type" values and default
herrick
parents: 57910
diff changeset
   447
    }
57038
b0f09e7c4680 8213963: Flatten out jpackager packages and resources
herrick
parents:
diff changeset
   448
}