// // aegis - project change supervisor // Copyright (C) 2001, 2002, 2004-2006, 2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include patch_list_ty * patch_slurp(string_ty *ifn) { // // open the input // os_become_orig(); input ifp = input_file_open(ifn); bool is_remote = ifp->is_remote(); // // Look for an RFC822 header. // // It could tell us useful things, like the content transfer // encoding, and the project name. // rfc822 hdr; hdr.load(ifp, true); // // Deal with the content encoding. // nstring s = hdr.get("content-transfer-encoding"); if (!s.empty()) { static nstring base64("base64"); static nstring uuencode("uuencode"); static nstring quotprin("quoted-printable"); static nstring eightbit("8bit"); static nstring sevenbit("7bit"); static nstring none("none"); // // We could cope with other encodings here, // if we ever need to. // if (s == base64) { // // The rest of the input is in base64 encoding. // ifp = new input_base64(ifp); } else if (s == uuencode) { // // The rest of the input is uuencoded. // ifp = new input_uudecode(ifp); } else if (s == quotprin) { // // The rest of the input is uuencoded. // ifp = new input_quoted_printable(ifp); } else if (s == sevenbit || s == eightbit || s == none) { // do nothing } else { sub_context_ty sc; sc.var_set_string("Name", s); string_ty *tmp = sc.subst_intl(i18n("content transfer encoding $name unknown")); ifp->fatal_error(tmp->str_text); str_free(tmp); } } // // The contents could be compressed. // ifp = input_gunzip_open(ifp); ifp = input_bunzip2_open(ifp); // // Filter out any CRLF sequences. // ifp = new input_crlf(ifp); // // Read the patch body. // patch_list_ty *plp = patch_read(ifp, 1); ifp.close(); os_become_undo(); assert(plp); if (is_remote) plp->comment = str_copy(ifn); // // Pull useful information out of the patch header. // s = hdr.get("x-aegis-project-name"); if (!s.empty()) plp->project_name = str_copy(s.get_ref()); s = hdr.get("x-aegis-change-number"); if (!s.empty()) { char *endptr = 0; long n = strtol(s.c_str(), &endptr, 0); if (!*endptr && n >= 0) plp->change_number = magic_zero_encode(n); } s = hdr.get("subject"); if (!s.empty()) plp->brief_description = str_copy(s.get_ref()); s = hdr.get("date"); if (!s.empty()) { if (!plp->description) plp->description = str_from_c("No description."); string_ty *s2 = str_format("Date: %s\n%s", s.c_str(), plp->description->str_text); str_free(plp->description); plp->description = s2; } s = hdr.get("from"); if (!s.empty()) { if (!plp->description) plp->description = str_from_c("No description."); string_ty *s2 = str_format("From: %s\n%s", s.c_str(), plp->description->str_text); str_free(plp->description); plp->description = s2; } // // all done // return plp; }