001/* 002 * Copyright 2007-2018 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("Changed-By", packageControlFile.get("Maintainer")); 073 set("Distribution", packageControlFile.get("Distribution")); 074 075 for (Entry<String, String> entry : packageControlFile.getUserDefinedFields().entrySet()) { 076 set(entry.getKey(), entry.getValue()); 077 } 078 079 StringBuilder description = new StringBuilder(); 080 description.append(packageControlFile.get("Package")); 081 if (packageControlFile.get("Description") != null) { 082 description.append(" - "); 083 description.append(packageControlFile.getShortDescription()); 084 } 085 set("Description", description.toString()); 086 } 087 088 public void setChanges(ChangeSet[] changeSets) { 089 StringBuilder sb = new StringBuilder(); 090 091 if (changeSets.length > 0) { 092 final ChangeSet mostRecentChangeSet = changeSets[0]; 093 set("Urgency", mostRecentChangeSet.getUrgency()); 094 set("Changed-By", mostRecentChangeSet.getChangedBy()); 095 096 for (ChangeSet changeSet : changeSets) { 097 sb.append(changeSet.toString()); 098 } 099 } 100 101 set("Changes", sb.toString()); 102 } 103 104 protected ControlField[] getFields() { 105 return FIELDS; 106 } 107 108 protected char getUserDefinedFieldLetter() { 109 return 'C'; 110 } 111 112 public static String formatDate(Date date) { 113 final DateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); // RFC 2822 format 114 return format.format(date); 115 } 116}