001/* 002 * Copyright 2007-2021 The jdeb developers. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.vafer.jdeb.debian; 018 019import org.vafer.jdeb.utils.Utils; 020import org.vafer.jdeb.changes.ChangeSet; 021 022import java.text.DateFormat; 023import java.text.SimpleDateFormat; 024import java.util.Date; 025import java.util.Locale; 026import java.util.Map.Entry; 027 028/** 029 * Reflecting a changes file 030 * 031 * @see <a href="http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debianchangesfiles">Debian Policy Manual - Debian changes files</a> 032 */ 033public final class ChangesFile extends ControlFile { 034 035 private static final ControlField[] FIELDS = { 036 new ControlField("Format", true), 037 new ControlField("Date", true), 038 new ControlField("Source", true), 039 new ControlField("Binary", true), 040 new ControlField("Architecture", true), 041 new ControlField("Version", true), 042 new ControlField("Distribution", true), 043 new ControlField("Urgency", true), 044 new ControlField("Maintainer", true), 045 new ControlField("Changed-By"), 046 new ControlField("Description", true, ControlField.Type.MULTILINE, true), 047 new ControlField("Changes", true, ControlField.Type.MULTILINE, true), 048 new ControlField("Closes"), 049 new ControlField("Checksums-Sha1", true, ControlField.Type.MULTILINE, true), 050 new ControlField("Checksums-Sha256", true, ControlField.Type.MULTILINE, true), 051 new ControlField("Files", true, ControlField.Type.MULTILINE, true) 052 }; 053 054 public ChangesFile() { 055 set("Format", "1.8"); 056 set("Urgency", "low"); 057 set("Distribution", "stable"); 058 } 059 060 /** 061 * Initializes the fields on the changes file with the values of the specified 062 * binary package control file. 063 * 064 * @param packageControlFile 065 */ 066 public void initialize(BinaryPackageControlFile packageControlFile) { 067 set("Binary", packageControlFile.get("Package")); 068 set("Source", Utils.defaultString(packageControlFile.get("Source"), packageControlFile.get("Package"))); 069 set("Architecture", packageControlFile.get("Architecture")); 070 set("Version", packageControlFile.get("Version")); 071 set("Maintainer", packageControlFile.get("Maintainer")); 072 set("Distribution", packageControlFile.get("Distribution")); 073 074 for (Entry<String, String> entry : packageControlFile.getUserDefinedFields().entrySet()) { 075 set(entry.getKey(), entry.getValue()); 076 } 077 078 StringBuilder description = new StringBuilder(); 079 description.append(packageControlFile.get("Package")); 080 if (packageControlFile.get("Description") != null) { 081 description.append(" - "); 082 description.append(packageControlFile.getShortDescription()); 083 } 084 set("Description", description.toString()); 085 } 086 087 public void setChanges(ChangeSet[] changeSets) { 088 StringBuilder sb = new StringBuilder(); 089 090 if (changeSets.length > 0) { 091 final ChangeSet mostRecentChangeSet = changeSets[0]; 092 set("Urgency", mostRecentChangeSet.getUrgency()); 093 set("Changed-By", mostRecentChangeSet.getChangedBy()); 094 095 for (ChangeSet changeSet : changeSets) { 096 sb.append(changeSet.toString()); 097 } 098 } 099 100 set("Changes", sb.toString()); 101 } 102 103 protected ControlField[] getFields() { 104 return FIELDS; 105 } 106 107 protected char getUserDefinedFieldLetter() { 108 return 'C'; 109 } 110 111 public static String formatDate(Date date) { 112 final DateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); // RFC 2822 format 113 return format.format(date); 114 } 115}