From 4f2d7949f03e1c198bc888f2d05f421d35c57e21 Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Mon, 9 Oct 2017 18:53:29 +0100 Subject: reinit the tree, so we can have metadata --- app-misc/pwsafe/Manifest | 11 +++ .../files/pwsafe-0.2.0-XChangeProperty.patch | 22 +++++ app-misc/pwsafe/files/pwsafe-0.2.0-cvs-1.57.patch | 48 +++++++++ .../pwsafe/files/pwsafe-0.2.0-fake-readline.patch | 107 +++++++++++++++++++++ .../pwsafe-0.2.0-man-page-option-syntax.patch | 30 ++++++ app-misc/pwsafe/files/pwsafe-0.2.0-printf.patch | 43 +++++++++ app-misc/pwsafe/metadata.xml | 27 ++++++ app-misc/pwsafe/pwsafe-0.2.0-r2.ebuild | 41 ++++++++ app-misc/pwsafe/pwsafe-0.2.0-r4.ebuild | 43 +++++++++ 9 files changed, 372 insertions(+) create mode 100644 app-misc/pwsafe/Manifest create mode 100644 app-misc/pwsafe/files/pwsafe-0.2.0-XChangeProperty.patch create mode 100644 app-misc/pwsafe/files/pwsafe-0.2.0-cvs-1.57.patch create mode 100644 app-misc/pwsafe/files/pwsafe-0.2.0-fake-readline.patch create mode 100644 app-misc/pwsafe/files/pwsafe-0.2.0-man-page-option-syntax.patch create mode 100644 app-misc/pwsafe/files/pwsafe-0.2.0-printf.patch create mode 100644 app-misc/pwsafe/metadata.xml create mode 100644 app-misc/pwsafe/pwsafe-0.2.0-r2.ebuild create mode 100644 app-misc/pwsafe/pwsafe-0.2.0-r4.ebuild (limited to 'app-misc/pwsafe') diff --git a/app-misc/pwsafe/Manifest b/app-misc/pwsafe/Manifest new file mode 100644 index 000000000000..ee2410d675f6 --- /dev/null +++ b/app-misc/pwsafe/Manifest @@ -0,0 +1,11 @@ +AUX pwsafe-0.2.0-XChangeProperty.patch 1613 SHA256 3a25d89918f96195da8eb28413719d724ccc2f62cb406b50795c71d3a04ccd28 SHA512 90329b172f6f1f9909c95c0cb648bb845c35e40ea78acf3d34c6ddfc1fae427694a5e0c2fa58de6a6614f432a81cdffe5b29e3a6211cae36924310ffc8b19680 WHIRLPOOL 1f8f23e340af6eab1a058514fb161ea85351fa36fd42e24f86275640be8be77f337ad459997246ab34f0ae7fe2e3f5ca8de56466cb2ab0c94f994f58fabee78c +AUX pwsafe-0.2.0-cvs-1.57.patch 1100 SHA256 a1e977b8b72f3d1ecd25c8feaa0ffe43dfcad370ba34e8489b2395583f1bdb69 SHA512 3772c833b16b29c5119f11a7c106e4a7b2d4d3f8cf17d42c78f5403cd5ae92136dadc16c5cfcf961822db4c76f04946412637547173a26227761f74d83765330 WHIRLPOOL 9f2848e113de4d8fcb3fe89f7a89d40c88bdd84c129022e25e99ecd6a7d931bc816f8a4f3a4327bb15a450b2084a179e148432cd37072c6882f7552c742e25ea +AUX pwsafe-0.2.0-fake-readline.patch 2667 SHA256 918293edb9196efce2a75f6e4cf1fc59addd766aa515a158b14f9bc4c3bb2cdd SHA512 466686d56662728c7c4d208ff69212daa84a86b746a9b4e52d48b2c7789d83fc1ad98673a8979a6f750c8215a0199e5580b5eb152b29e13761b1254eab30778e WHIRLPOOL 3706c9399c8e6aaa76876bf9a9465a9ec5571ad4cf2407a56f3c65bba19c62342cbeec2c4a6c46f71827397942855c1a3b2908791212cdac25f3609a90a6f4be +AUX pwsafe-0.2.0-man-page-option-syntax.patch 848 SHA256 858865706f8cdb30712f210bb7f03edf327934fe3e4ab04376b844de35aa4de3 SHA512 17697927e64e5bcdbc68343775732e1559dd7fe5c000b15fda9af7229f3c2c36bbd4ee3af3c652da9e8d0550acd1b5bb39a75891f5f40c37640ea089a5b6306e WHIRLPOOL 9ffee426e01235e548be9667ee173ef7c7bd681b0b9885f00580c7f6e2356cf032ec8f34ec4d6f73a2215e1fa11481a548447c8e9b0dcae7638612b52fa29417 +AUX pwsafe-0.2.0-printf.patch 1868 SHA256 927afd52a65d582cd089f1aba3298d17a7d356403ad323c3d2e7526db1279279 SHA512 7567e666f7dfb9c798aa2e6368ea1abf72f749c953da42bff7ef1b61aea6bf2faca96ef702ef9f7a9ceeece90999c066763006e549c5f2ec365cbf9358547449 WHIRLPOOL da2dc316d88ca010f39b30d4eb0e1868ec41b9988c4d33e1d4f013d234658c905659a5f52180e5d03721edbaa488c119cbf7cdb04b7701b981a4311f3d7c28e5 +DIST pwsafe-0.2.0.tar.gz 127433 SHA256 61e91dc5114fe014a49afabd574eda5ff49b36c81a6d492c03fcb10ba6af47b7 SHA512 e8d3684f523f83def6317ef5561a02d1493685cfbda18707644bf335b7f45b1a548aae17a735838d9f6df345ddb17934607162a6e99348df625b34a9ad5f4cf3 WHIRLPOOL c80ef8c398e5cb68920b11815e0aa042adf2ddaa78c75157e346566b210f5aba000f71c4a2172d6cf2c5a9707fe82af8a1379dbf9bb3ac2f71b6e12aebbbb975 +EBUILD pwsafe-0.2.0-r2.ebuild 905 SHA256 98e8e78dc97923db9bb23e7ef6fa96ce80c4fe50de35759d25489e0c79b7eb13 SHA512 ea570ed13a7c3316a38d9c3760b36b3a54bcb837eedc72c6252eedcfbea8a1b911dd8c3c939a6f54af362d9f130f96ebcc950d4bc2d85768f49b47c67be94b94 WHIRLPOOL 59bd659b230aa0fe87145863cbe298a3336d4241500f1628aabcff926cfbe7e404817144ca22f1a7d5b87b375cf59ad4646e69ce1e039634af06adb013ee720f +EBUILD pwsafe-0.2.0-r4.ebuild 1018 SHA256 700893f187c485462917d7100e30cab20b5b57004f30c42e3250713363ac13cf SHA512 e1d12d8607794c94a81aaae7fcdafc4928890f1e9536a88a205c5f04c7b2f76ab223a6a9c3ac3f807261aa5d1ef924378b3413936e1b8f4447b87f71b911f79d WHIRLPOOL 161a10d411578139f18c7d70945c81e89dfe34c4b3cdcf38c1a3c00bb3b6480e4d281bfb9d330c45f590be6c2e475a0e6cd726356669d42069cc166074685e38 +MISC ChangeLog 3247 SHA256 e68591068deda28f723e77415893918930e9bc9d64e34f5021c7c758b9e2fbfc SHA512 a3ff6887d3fe5a249cdd7fc937c60bb9134f15a29e1dd7ac6e17c27172588136c79d2beb53fd7f63d3ddc3ecb48ebd65c2102bf20aa457e30cf0ad21bc60cfa7 WHIRLPOOL 9ac6db5cc7489414f690ab1227e828aa4cc4d02207c565ab17bd4a35f38995bc8e39cc127f1a950ad795491b0b03ef18cf95fdfaa5978e14bfe330770bd95ea9 +MISC ChangeLog-2015 2728 SHA256 2e2f5c5891dde9ad6e02b5e8c72686c9206f02fe75a99520d48d6351cbad6523 SHA512 2e6205b98250a69293a687cac701436342c969da8fb5be6ceec3168e1c2089d79d750ec717cd009d76eb4ece27e3ae177f968dfc71238dc63c662586264db268 WHIRLPOOL c2b7ba2232a9b4836051f3787d82a44d4be0860ec1154ca8ff8666da0c9256834aaf2cbf654ea01d24cf9402a2ecb9417b431f2c36e81f793b62a80d478f97ec +MISC metadata.xml 959 SHA256 e65094c7e58e383616aeca6c03ccd0f958cd59ceec3076a038617d714625ced6 SHA512 c4724594e4782281676d98634f9966b78af472f3171d17f86d448d65bf4a543126e89616d0d83a4fa3acac4f7c49c77c1c061f276ef2a906e06623c300920269 WHIRLPOOL a443ce87918fba02ec0b9fa80e9ef7c5db7d27818d6ad278670a78222c3fff8346733316326dc2c6bda3cddff995e87e0ab16a6eadb5e97c38a0e4200444d4c0 diff --git a/app-misc/pwsafe/files/pwsafe-0.2.0-XChangeProperty.patch b/app-misc/pwsafe/files/pwsafe-0.2.0-XChangeProperty.patch new file mode 100644 index 000000000000..3fadfc2765fb --- /dev/null +++ b/app-misc/pwsafe/files/pwsafe-0.2.0-XChangeProperty.patch @@ -0,0 +1,22 @@ +This patch came from . + +Index: pwsafe.cpp +=================================================================== +RCS file: /cvsroot/pwsafe/pwsafe/pwsafe.cpp,v +retrieving revision 1.57 +diff -u -r1.57 pwsafe.cpp +--- pwsafe.cpp 12 Aug 2007 12:33:06 -0000 1.57 ++++ pwsafe.cpp 5 Jan 2011 22:16:43 -0000 +@@ -1820,10 +1820,10 @@ + if (xev.xselectionrequest.target == XA_TARGETS(xdisplay)) { + // tell them what we can supply + const Atom targets[] = { XA_TARGETS(xdisplay), XA_TIMESTAMP(xdisplay), XA_TEXT(xdisplay), XA_STRING }; +- XChangeProperty(xdisplay, xev.xselectionrequest.requestor, prop, XA_TARGETS(xdisplay), 32, PropModeReplace, reinterpret_cast(&targets), sizeof(targets)/sizeof(targets[0])); ++ XChangeProperty(xdisplay, xev.xselectionrequest.requestor, prop, XA_ATOM, 32, PropModeReplace, reinterpret_cast(&targets), sizeof(targets)/sizeof(targets[0])); + } + else if (xev.xselectionrequest.target == XA_TIMESTAMP(xdisplay)) { +- XChangeProperty(xdisplay, xev.xselectionrequest.requestor, prop, XA_TIMESTAMP(xdisplay), 32, PropModeReplace, reinterpret_cast(×tamp), 1); ++ XChangeProperty(xdisplay, xev.xselectionrequest.requestor, prop, XA_INTEGER, 32, PropModeReplace, reinterpret_cast(×tamp), 1); + } + else if (xev.xselectionrequest.target == XA_TEXT(xdisplay) || + xev.xselectionrequest.target == XA_STRING) { diff --git a/app-misc/pwsafe/files/pwsafe-0.2.0-cvs-1.57.patch b/app-misc/pwsafe/files/pwsafe-0.2.0-cvs-1.57.patch new file mode 100644 index 000000000000..7f62eb59d429 --- /dev/null +++ b/app-misc/pwsafe/files/pwsafe-0.2.0-cvs-1.57.patch @@ -0,0 +1,48 @@ +Index: pwsafe.cpp +=================================================================== +RCS file: /cvsroot/pwsafe/pwsafe/pwsafe.cpp,v +retrieving revision 1.56 +retrieving revision 1.57 +diff -u -r1.56 -r1.57 +--- pwsafe.cpp 30 Sep 2005 10:30:56 -0000 1.56 ++++ pwsafe.cpp 12 Aug 2007 12:33:06 -0000 1.57 +@@ -3346,6 +3346,12 @@ + } + + bufpos += rc; ++ buf[bufpos] = '\0'; ++ ++ if (rc == 0) { ++ // EOF (ctrl-D) ++ break; ++ } + + if (bufpos == buflen && !strchr(buf,'\n')) { + // we needed a bigger buffer +@@ -3354,6 +3360,7 @@ + fprintf(stderr, "Error: %s out of memory\n", program_name); + memset(buf,0,buflen); + free(buf); ++ throw FailEx(); + } + + memcpy(new_buf, buf, bufpos); +@@ -3364,9 +3371,15 @@ + } + } + +- int len = strchr(buf,'\n') - buf; +- saved.assign(buf+len+1, bufpos-(len+1)); +- buf[len] = '\0'; ++ char* lf = strchr(buf,'\n'); ++ if (lf) { ++ // save the rest of the input for later ++ saved.assign(lf+1); ++ *lf = '\0'; ++ } else { ++ saved.assign("",0); ++ } ++ + return buf; + } + #endif // WITH_READLINE diff --git a/app-misc/pwsafe/files/pwsafe-0.2.0-fake-readline.patch b/app-misc/pwsafe/files/pwsafe-0.2.0-fake-readline.patch new file mode 100644 index 000000000000..4e0f4ad4dfd6 --- /dev/null +++ b/app-misc/pwsafe/files/pwsafe-0.2.0-fake-readline.patch @@ -0,0 +1,107 @@ +Index: pwsafe.cpp +=================================================================== +RCS file: /cvsroot/pwsafe/pwsafe/pwsafe.cpp,v +retrieving revision 1.57 +diff -u -r1.57 pwsafe.cpp +--- pwsafe.cpp 12 Aug 2007 12:33:06 -0000 1.57 ++++ pwsafe.cpp 30 Mar 2011 07:22:11 -0000 +@@ -3325,61 +3325,48 @@ + static char* readline(const char* prompt) { + printf("%s", prompt); + fflush(stdout); +- +- static secstring saved; +- int buflen = saved.length() + 100; +- int bufpos = saved.length(); +- char* buf = reinterpret_cast(malloc(buflen+1)); +- if (!buf) +- throw FailEx(); +- memcpy(buf, saved.data(), saved.length()); +- buf[saved.length()] = '\0'; +- +- while (!strchr(buf,'\n')) { +- const int rc = ::read(STDIN_FILENO, buf+bufpos, buflen); +- +- if (rc == -1) { +- fprintf(stderr, "Error: %s read(STDIN) failed: %s\n", program_name, strerror(errno)); +- memset(buf,0,buflen); +- free(buf); +- throw FailEx(); +- } +- +- bufpos += rc; +- buf[bufpos] = '\0'; +- +- if (rc == 0) { +- // EOF (ctrl-D) +- break; +- } +- +- if (bufpos == buflen && !strchr(buf,'\n')) { +- // we needed a bigger buffer +- char* new_buf = reinterpret_cast(malloc(2*buflen+1)); +- if (!new_buf) { +- fprintf(stderr, "Error: %s out of memory\n", program_name); +- memset(buf,0,buflen); +- free(buf); +- throw FailEx(); +- } + +- memcpy(new_buf, buf, bufpos); +- memset(buf, 0, buflen); +- free(buf); +- buf = new_buf; +- buflen *= 2; +- } +- } ++ size_t buflen = 100; ++ size_t bufpos = 0; ++ char* buf = static_cast(malloc(buflen+1)); ++ if (!buf) ++ throw FailEx(); + +- char* lf = strchr(buf,'\n'); +- if (lf) { +- // save the rest of the input for later +- saved.assign(lf+1); +- *lf = '\0'; +- } else { +- saved.assign("",0); ++ for (;;) { ++ const ssize_t rc = ::read(STDIN_FILENO, buf+bufpos, 1); ++ if (rc == -1) { ++ fprintf(stderr, "Error: %s read(STDIN) failed: %s\n", program_name, strerror(errno)); ++ memset(buf,0,bufpos); ++ free(buf); ++ throw FailEx(); ++ } else if (rc == 0) { ++ // EOF (ctrl-D) ++ break; ++ } else if (buf[bufpos] == '\n') { ++ // end of line ++ break; ++ } ++ ++ ++bufpos; ++ ++ if (bufpos == buflen) { ++ // we need a bigger buffer ++ char* new_buf = static_cast(malloc(2*buflen+1)); ++ if (!new_buf) { ++ fprintf(stderr, "Error: %s out of memory\n", program_name); ++ memset(buf,0,bufpos); ++ free(buf); ++ throw FailEx(); ++ } ++ memcpy(new_buf, buf, bufpos); ++ memset(buf, 0, bufpos); ++ free(buf); ++ buf = new_buf; ++ buflen *= 2; ++ } + } + ++ buf[bufpos] = '\0'; + return buf; + } + #endif // WITH_READLINE diff --git a/app-misc/pwsafe/files/pwsafe-0.2.0-man-page-option-syntax.patch b/app-misc/pwsafe/files/pwsafe-0.2.0-man-page-option-syntax.patch new file mode 100644 index 000000000000..a83d3a83d8eb --- /dev/null +++ b/app-misc/pwsafe/files/pwsafe-0.2.0-man-page-option-syntax.patch @@ -0,0 +1,30 @@ +Index: pwsafe.1.in +=================================================================== +RCS file: /cvsroot/pwsafe/pwsafe/pwsafe.1.in,v +retrieving revision 1.8 +diff -u -r1.8 pwsafe.1.in +--- pwsafe.1.in 18 Mar 2006 14:17:41 -0000 1.8 ++++ pwsafe.1.in 30 Mar 2011 07:42:23 -0000 +@@ -52,18 +52,18 @@ + .B \-\-passwd + Change the database's passphrase. + .TP +-.B \-\-list[=REGEX] ++.B \-\-list [REGEX] + List all [matching] entries in database. + .BR + If \-u or \-p is given then REGEX must match only one entry, and only the requested field(s) are emitted. + .TP +-.B \-a, \-\-add[=NAME] ++.B \-a, \-\-add [NAME] + Add an entry to database. + .TP +-.B \-e, \-\-edit=REGEX ++.B \-e, \-\-edit REGEX + Edit an entry. + .TP +-.B \-\-delete=NAME ++.B \-\-delete NAME + Delete an entry from database. + .TP + If no command is given, an interactive mode is entered. diff --git a/app-misc/pwsafe/files/pwsafe-0.2.0-printf.patch b/app-misc/pwsafe/files/pwsafe-0.2.0-printf.patch new file mode 100644 index 000000000000..409f3a7220ed --- /dev/null +++ b/app-misc/pwsafe/files/pwsafe-0.2.0-printf.patch @@ -0,0 +1,43 @@ +Index: pwsafe.cpp +=================================================================== +RCS file: /cvsroot/pwsafe/pwsafe/pwsafe.cpp,v +retrieving revision 1.57 +diff -u -r1.57 pwsafe.cpp +--- pwsafe.cpp 12 Aug 2007 12:33:06 -0000 1.57 ++++ pwsafe.cpp 30 Mar 2011 05:44:07 -0000 +@@ -1619,7 +1619,7 @@ + snprintf(ent_buf, sizeof(ent_buf), "%d", entropy_needed); + ent_buf[sizeof(ent_buf)-1] = '\0'; + char len_buf[24]; +- snprintf(len_buf, sizeof(len_buf), "%d", pw.length()); ++ snprintf(len_buf, sizeof(len_buf), "%lu", static_cast(pw.length())); + len_buf[sizeof(len_buf)-1] = '\0'; + switch (tolower(get1char("Use "+pw+"\ntype "+type_name+", length "+len_buf+", "+ent_buf+" bits of entropy [y/N/ /+/-/q/?] ? ", 'n'))) { + case 'y': +@@ -2380,7 +2380,7 @@ + version = VERSION_1_7; + } + +- if (arg_verbose > 1) printf("read in %u entries\n", entries.size()); ++ if (arg_verbose > 1) printf("read in %lu entries\n", static_cast(entries.size())); + + opened = true; + return true; +@@ -2601,7 +2601,7 @@ + for (matches_t::const_iterator i=matches.begin(); i!=matches.end() && count < 3; ++i, ++count) + printf("%s%s", (count?", ":""), (*i)->groupname().c_str()); + if (count != matches.size()) +- printf(", ... (%u more) ", matches.size()-3); ++ printf(", ... (%lu more) ", static_cast(matches.size()-3)); + printf(".\n"); + throw FailEx(); + } +@@ -2637,7 +2637,7 @@ + // print out the UUID too + fprintf(outfile, "%s\n", formatuuid(e.uuid).c_str()); + if (!e.extras.empty()) +- fprintf(outfile, "and %u unknown extra fields\n", e.extras.size()); ++ fprintf(outfile, "and %lu unknown extra fields\n", static_cast(e.extras.size())); + } + } else + // just print out the name diff --git a/app-misc/pwsafe/metadata.xml b/app-misc/pwsafe/metadata.xml new file mode 100644 index 000000000000..6fcce0a560fe --- /dev/null +++ b/app-misc/pwsafe/metadata.xml @@ -0,0 +1,27 @@ + + + + + chead@chead.ca + Christopher Head + Proxy maintainer, assign bugs + + + proxy-maint@gentoo.org + Proxy Maintainers + + + pwsafe is a commandline password database utility compatible with + Counterpane's Password Safe. It is compatible with Counterpane Password + Safe 1.9.x and 2.0 databases. It can interact with X11 selection and + clipboard. + + + + ndade@nsd.dyndns.org + Nicolas Dade + + pwsafe + nsd20463/pwsafe + + diff --git a/app-misc/pwsafe/pwsafe-0.2.0-r2.ebuild b/app-misc/pwsafe/pwsafe-0.2.0-r2.ebuild new file mode 100644 index 000000000000..43c603b050b4 --- /dev/null +++ b/app-misc/pwsafe/pwsafe-0.2.0-r2.ebuild @@ -0,0 +1,41 @@ +# Copyright 1999-2012 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +EAPI=4 +inherit base eutils + +DESCRIPTION="A Password Safe compatible command-line password manager" +HOMEPAGE="http://nsd.dyndns.org/pwsafe/" +SRC_URI="http://nsd.dyndns.org/pwsafe/releases/${P}.tar.gz" +PATCHES=( + "${FILESDIR}/${P}-cvs-1.57.patch" + "${FILESDIR}/${P}-printf.patch" + "${FILESDIR}/${P}-fake-readline.patch" + "${FILESDIR}/${P}-man-page-option-syntax.patch" + "${FILESDIR}/${P}-XChangeProperty.patch" + ) + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="amd64 x86" + +IUSE="X readline" + +DEPEND="sys-libs/ncurses + dev-libs/openssl + readline? ( sys-libs/readline ) + X? ( x11-libs/libSM + x11-libs/libICE + x11-libs/libXmu + x11-libs/libX11 )" +RDEPEND="${DEPEND}" + +src_configure() { + econf $(use_with X x) $(use_with readline) +} + +src_install() { + doman pwsafe.1 + dobin pwsafe + dodoc README NEWS +} diff --git a/app-misc/pwsafe/pwsafe-0.2.0-r4.ebuild b/app-misc/pwsafe/pwsafe-0.2.0-r4.ebuild new file mode 100644 index 000000000000..0ced0a097b81 --- /dev/null +++ b/app-misc/pwsafe/pwsafe-0.2.0-r4.ebuild @@ -0,0 +1,43 @@ +# Copyright 1999-2017 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 + +DESCRIPTION="A Password Safe compatible command-line password manager" +HOMEPAGE="http://nsd.dyndns.org/pwsafe/" +SRC_URI="http://nsd.dyndns.org/pwsafe/releases/${P}.tar.gz" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="amd64 ~x86" + +IUSE="X libressl readline" + +DEPEND="sys-libs/ncurses:0= + !libressl? ( dev-libs/openssl:0= ) + libressl? ( dev-libs/libressl:0= ) + readline? ( sys-libs/readline:0= ) + X? ( x11-libs/libSM + x11-libs/libICE + x11-libs/libXmu + x11-libs/libX11 )" +RDEPEND="${DEPEND}" + +src_prepare() { + eapply -p0 "${FILESDIR}/${P}-cvs-1.57.patch" + eapply -p0 "${FILESDIR}/${P}-printf.patch" + eapply -p0 "${FILESDIR}/${P}-fake-readline.patch" + eapply -p0 "${FILESDIR}/${P}-man-page-option-syntax.patch" + eapply -p0 "${FILESDIR}/${P}-XChangeProperty.patch" + eapply_user +} + +src_configure() { + econf $(use_with X x) $(use_with readline) +} + +src_install() { + doman pwsafe.1 + dobin pwsafe + dodoc README NEWS +} -- cgit v1.2.3