Date: Sun, 26 Jul 2015 11:21:37 +0000 (UTC) From: Baptiste Daroussin <bapt@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r285890 - in head: etc/mtree gnu/usr.bin/rcs gnu/usr.bin/rcs/ident tools/build/mk usr.bin usr.bin/ident usr.bin/ident/tests Message-ID: <201507261121.t6QBLb86093721@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: bapt Date: Sun Jul 26 11:21:36 2015 New Revision: 285890 URL: https://svnweb.freebsd.org/changeset/base/285890 Log: Replace GNU RCS ident with a BSD license ident Rationale: ident(1) is useful out of RCS, lot of scripts are using ident(1) and failing when base is built WITHOUT_RCS. This version is: - fully compatible with RCS 5.7 ident. - fully compatible with RCS 5.9 ident. - passes all ident test from GNU RCS 5.9 test suite This version has support for: svn extension for the Keyword id (double colon and # before last $) Différences with GNU RCS ident: - no long options as found in GNU RCS 5.9 (but not commented there). - '-V' reports nothing but has been added for compatibility. Differential Revision: https://reviews.freebsd.org/D3200 Reviewed by: pfg Added: head/usr.bin/ident/ head/usr.bin/ident/Makefile (contents, props changed) head/usr.bin/ident/ident.1 (contents, props changed) head/usr.bin/ident/ident.c (contents, props changed) head/usr.bin/ident/tests/ head/usr.bin/ident/tests/Makefile (contents, props changed) head/usr.bin/ident/tests/ident.sh (contents, props changed) head/usr.bin/ident/tests/test.in (contents, props changed) head/usr.bin/ident/tests/test.out (contents, props changed) head/usr.bin/ident/tests/testnoid (contents, props changed) Deleted: head/gnu/usr.bin/rcs/ident/ Modified: head/etc/mtree/BSD.tests.dist head/gnu/usr.bin/rcs/Makefile head/tools/build/mk/OptionalObsoleteFiles.inc head/usr.bin/Makefile Modified: head/etc/mtree/BSD.tests.dist ============================================================================== --- head/etc/mtree/BSD.tests.dist Sun Jul 26 11:16:48 2015 (r285889) +++ head/etc/mtree/BSD.tests.dist Sun Jul 26 11:21:36 2015 (r285890) @@ -528,6 +528,8 @@ .. gzip .. + ident + .. join .. jot Modified: head/gnu/usr.bin/rcs/Makefile ============================================================================== --- head/gnu/usr.bin/rcs/Makefile Sun Jul 26 11:16:48 2015 (r285889) +++ head/gnu/usr.bin/rcs/Makefile Sun Jul 26 11:21:36 2015 (r285890) @@ -1,3 +1,5 @@ -SUBDIR= lib ci co ident merge rcs rcsclean rcsdiff rcsmerge rlog rcsfreeze +# $FreeBSD$ + +SUBDIR= lib ci co merge rcs rcsclean rcsdiff rcsmerge rlog rcsfreeze .include <bsd.subdir.mk> Modified: head/tools/build/mk/OptionalObsoleteFiles.inc ============================================================================== --- head/tools/build/mk/OptionalObsoleteFiles.inc Sun Jul 26 11:16:48 2015 (r285889) +++ head/tools/build/mk/OptionalObsoleteFiles.inc Sun Jul 26 11:21:36 2015 (r285890) @@ -6316,7 +6316,6 @@ OLD_FILES+=usr/share/man/man8/rwhod.8.gz .if ${MK_RCS} == no OLD_FILES+=usr/bin/ci OLD_FILES+=usr/bin/co -OLD_FILES+=usr/bin/ident OLD_FILES+=usr/bin/merge OLD_FILES+=usr/bin/rcs OLD_FILES+=usr/bin/rcsclean @@ -6327,7 +6326,6 @@ OLD_FILES+=usr/bin/rlog OLD_FILES+=usr/sbin/etcupdate OLD_FILES+=usr/share/man/man1/ci.1.gz OLD_FILES+=usr/share/man/man1/co.1.gz -OLD_FILES+=usr/share/man/man1/ident.1.gz OLD_FILES+=usr/share/man/man1/merge.1.gz OLD_FILES+=usr/share/man/man1/rcs.1.gz OLD_FILES+=usr/share/man/man1/rcsclean.1.gz Modified: head/usr.bin/Makefile ============================================================================== --- head/usr.bin/Makefile Sun Jul 26 11:16:48 2015 (r285889) +++ head/usr.bin/Makefile Sun Jul 26 11:21:36 2015 (r285890) @@ -64,6 +64,7 @@ SUBDIR= ${_addr2line} \ hexdump \ ${_iconv} \ id \ + ident \ ipcrm \ ipcs \ join \ Added: head/usr.bin/ident/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/ident/Makefile Sun Jul 26 11:21:36 2015 (r285890) @@ -0,0 +1,13 @@ +# $FreeBSD$ + +.include <src.opts.mk> + +PROG= ident + +LIBADD= sbuf + +.if ${MK_TESTS} != "no" +SUBDIR+= tests +.endif + +.include <bsd.prog.mk> Added: head/usr.bin/ident/ident.1 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/ident/ident.1 Sun Jul 26 11:21:36 2015 (r285890) @@ -0,0 +1,68 @@ +.\" Copyright (c) 2015 Baptiste Daroussin <bapt@FreeBSD.org> +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd Jul 25, 2015 +.Dt IDENT 1 +.Os +.Sh NAME +.Nm ident +.Nd identify RCS keyword string in files +.Sh SYNOPSIS +.Nm +.Op Fl q +.Op Fl V +.Op Ar File Ns s +.Sh DESCRIPTION +The +.Nm +utility searches for all instances of the pattern +.Sq $keyword: text$ +in +.Ar files . +.Pp +If no arguments are passed, then +.Nm +parses the standard input. +.Pp +.Em keyword +must only be composed of alphanumeric values in the C locale, followed by +.Sq \&: +and a space. +.Pp +These options are supported: +.Bl -tag -width "XXX" +.It Fl q +Quiet mode: suppress warnings if no pattern found. +.It Fl V +Do nothing, added for compatibility with GNU ident. +.El +.Sh EXIT STATUS +.Ex -std ident +.Sh AUTHORS +This version of the +.Nm +utility was written by +.An Baptiste Daroussin Aq Mt bapt@FreeBSD.org . Added: head/usr.bin/ident/ident.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/ident/ident.c Sun Jul 26 11:21:36 2015 (r285890) @@ -0,0 +1,173 @@ +/*- + * Copyright (c) 2015 Baptiste Daroussin <bapt@FreeBSD.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/types.h> +#include <sys/sbuf.h> + +#include <ctype.h> +#include <err.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <xlocale.h> + +static bool +parse_id(FILE *fp, struct sbuf *buf, locale_t l) +{ + int c; + bool isid = false; + bool subversion = false; + + sbuf_putc(buf, '$'); + while ((c = fgetc(fp)) != EOF) { + sbuf_putc(buf, c); + if (!isid) { + if (c == '$') { + sbuf_clear(buf); + sbuf_putc(buf, '$'); + continue; + } + if (c == ':') { + c = fgetc(fp); + /* accept :: for subversion compatibility */ + if (c == ':') { + subversion = true; + sbuf_putc(buf, c); + c = fgetc(fp); + } + if (c == ' ') { + sbuf_putc(buf, c); + isid = true; + continue; + } + return (false); + } + + if (!isalpha_l(c, l)) + return (false); + } else { + if (c == '\n') + return (false); + if (c == '$') { + sbuf_finish(buf); + /* should end with a space */ + c = sbuf_data(buf)[sbuf_len(buf) - 2]; + if (!subversion) { + if (c != ' ') + return (0); + } else if (subversion) { + if (c != ' ' && c != '#') + return (0); + } + printf(" %s\n", sbuf_data(buf)); + return (true); + } + } + } + + return (false); +} + +static int +scan(FILE *fp, const char *name, bool quiet) +{ + int c; + bool hasid = false; + struct sbuf *id = sbuf_new_auto(); + locale_t l; + + l = newlocale(LC_ALL_MASK, "C", NULL); + + if (name != NULL) + printf("%s:\n", name); + + while ((c = fgetc(fp)) != EOF) { + if (c == '$') { + sbuf_clear(id); + if (parse_id(fp, id, l)) + hasid = true; + } + } + sbuf_delete(id); + freelocale(l); + + if (!hasid) { + if (!quiet) + fprintf(stderr, "%s warning: no id keywords in %s\n", + getprogname(), name ? name : "standard input"); + + return (EXIT_FAILURE); + } + + return (EXIT_SUCCESS); +} + +int +main(int argc, char **argv) +{ + bool quiet = false; + int ch, i; + int ret = EXIT_SUCCESS; + FILE *fp; + + while ((ch = getopt(argc, argv, "qV")) != -1) { + switch (ch) { + case 'q': + quiet = true; + break; + case 'V': + /* Do nothing, compat with GNU rcs's ident */ + return (EXIT_SUCCESS); + default: + errx(EXIT_FAILURE, "usage: %s [-q] [-V] [file...]", + getprogname()); + } + } + + argc -= optind; + argv += optind; + + if (argc == 0) + return (scan(stdin, NULL, quiet)); + + for (i = 0; i < argc; i++) { + fp = fopen(argv[i], "r"); + if (fp == NULL) { + warn("%s", argv[i]); + ret = EXIT_FAILURE; + continue; + } + if (scan(fp, argv[i], quiet) != EXIT_SUCCESS) + ret = EXIT_FAILURE; + fclose(fp); + } + + return (ret); +} Added: head/usr.bin/ident/tests/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/ident/tests/Makefile Sun Jul 26 11:21:36 2015 (r285890) @@ -0,0 +1,11 @@ +# $FreeBSD$ + +TESTSDIR= ${TESTSBASE}/usr.bin/ident + +ATF_TESTS_SH= ident +FILES= test.in \ + test.out \ + testnoid +FILESDIR= ${TESTSDIR} + +.include <bsd.test.mk> Added: head/usr.bin/ident/tests/ident.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/ident/tests/ident.sh Sun Jul 26 11:21:36 2015 (r285890) @@ -0,0 +1,16 @@ +# $FreeBSD$ + +atf_test_case ident +ident_body() { + atf_check -o file:$(atf_get_srcdir)/test.out \ + ident < $(atf_get_srcdir)/test.in + atf_check -o match:'Foo.*' -s exit:1 \ + -e inline:"ident warning: no id keywords in $(atf_get_srcdir)/testnoid\n" \ + ident $(atf_get_srcdir)/test.in $(atf_get_srcdir)/testnoid + atf_check -o match:'Foo.*' -s exit:1 \ + ident -q $(atf_get_srcdir)/test.in $(atf_get_srcdir)/testnoid +} +atf_init_test_cases() +{ + atf_add_test_case ident +} Added: head/usr.bin/ident/tests/test.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/ident/tests/test.in Sun Jul 26 11:21:36 2015 (r285890) @@ -0,0 +1,15 @@ +# tranditional + $Foo: bar $ (OK traditional) + $$Foo: bar $ + $$Fo$o: bar $ + $Fo$o: bar $ + $ Foo : bar $ (WRONG -- NON ALPHANUM BEFORE :) + $ Foo : bar $ (WRONG -- NON ALPHANUM BEFORE :) + $Foo: bar $ (WRONG -- NO SPACE AFTER :) + $Foo:bar $ (WRONG -- NO SPACE AFTER :) + $Foo: bar$ (WRONG -- NO SPACE BEFORE $)) +# Subversion like + $Bar:: baz$ (WRONG -- NO SPACE BEFORE $) + $Bar:: baz $ (OK -- SPACE BEFORE $) + $Qux:: frobby zow#$ (OK -- HASH BEFORE $)' ' + Added: head/usr.bin/ident/tests/test.out ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/ident/tests/test.out Sun Jul 26 11:21:36 2015 (r285890) @@ -0,0 +1,6 @@ + $Foo: bar $ + $Foo: bar $ + $o: bar $ + $o: bar $ + $Bar:: baz $ + $Qux:: frobby zow#$ Added: head/usr.bin/ident/tests/testnoid ==============================================================================
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507261121.t6QBLb86093721>