From 2f54b716e4d3cb0dc99066638fed631e3cbec97c Mon Sep 17 00:00:00 2001 From: Richard Lowe Date: Mon, 23 Aug 2010 22:22:42 -0400 Subject: [PATCH] 43 development tools should be adjusted to understand the brave new world Reviewed by: garrett@nexenta.com Approved by: garrett@nexenta.com --- usr/src/pkg/manifests/developer-build-onbld.mf | 18 +- usr/src/tools/README.tools | 34 +- usr/src/tools/onbld/Checks/Comments.py | 82 +- .../rtichk.py => onbld/Checks/Copyright.py} | 54 +- usr/src/tools/onbld/Checks/DbLookups.py | 663 +-- usr/src/tools/onbld/Checks/HdrChk.py | 11 +- usr/src/tools/onbld/Checks/Makefile | 5 +- usr/src/tools/onbld/Checks/Rti.py | 153 - usr/src/tools/onbld/Checks/__init__.py | 21 +- usr/src/tools/onbld/hgext/cdm.py | 65 +- usr/src/tools/scripts/Makefile | 16 +- usr/src/tools/scripts/hgsetup.sh | 35 +- usr/src/tools/scripts/its.conf | 6 +- usr/src/tools/scripts/its.reg | 11 +- usr/src/tools/scripts/keywords.sh | 175 - usr/src/tools/scripts/sccscp.1 | 60 - usr/src/tools/scripts/sccscp.sh | 222 - usr/src/tools/scripts/sccshist.sh | 152 - usr/src/tools/scripts/sccsmv.1 | 39 - usr/src/tools/scripts/sccsmv.sh | 106 - usr/src/tools/scripts/sccsrm.1 | 46 - usr/src/tools/scripts/sccsrm.sh | 126 - usr/src/tools/scripts/webrev.sh | 7 +- usr/src/tools/scripts/wx.1 | 731 --- usr/src/tools/scripts/wx.sh | 5079 -------------------- usr/src/tools/scripts/wx2hg.sh | 412 -- 26 files changed, 275 insertions(+), 8054 deletions(-) rename usr/src/tools/{scripts/rtichk.py => onbld/Checks/Copyright.py} (50%) rewrite usr/src/tools/onbld/Checks/DbLookups.py (74%) delete mode 100644 usr/src/tools/onbld/Checks/Rti.py delete mode 100644 usr/src/tools/scripts/keywords.sh delete mode 100644 usr/src/tools/scripts/sccscp.1 delete mode 100644 usr/src/tools/scripts/sccscp.sh delete mode 100644 usr/src/tools/scripts/sccshist.sh delete mode 100644 usr/src/tools/scripts/sccsmv.1 delete mode 100644 usr/src/tools/scripts/sccsmv.sh delete mode 100644 usr/src/tools/scripts/sccsrm.1 delete mode 100644 usr/src/tools/scripts/sccsrm.sh delete mode 100644 usr/src/tools/scripts/wx.1 delete mode 100644 usr/src/tools/scripts/wx.sh delete mode 100644 usr/src/tools/scripts/wx2hg.sh diff --git a/usr/src/pkg/manifests/developer-build-onbld.mf b/usr/src/pkg/manifests/developer-build-onbld.mf index 97a9468451..28f0277ea0 100644 --- a/usr/src/pkg/manifests/developer-build-onbld.mf +++ b/usr/src/pkg/manifests/developer-build-onbld.mf @@ -23,6 +23,8 @@ # Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. # +# Copyright 2010, Richard Lowe + set name=pkg.fmri value=pkg:/developer/build/onbld@$(PKGVERS) set name=pkg.description value="tools used to build the OS-Net consolidation" set name=pkg.summary value="OS-Net Build Tools" @@ -119,12 +121,7 @@ file path=opt/onbld/bin/mktpl mode=0555 file path=opt/onbld/bin/nightly mode=0555 file path=opt/onbld/bin/onu mode=0555 file path=opt/onbld/bin/protocmp.terse mode=0555 -file path=opt/onbld/bin/rtichk mode=0555 file path=opt/onbld/bin/sccscheck mode=0555 -file path=opt/onbld/bin/sccscp mode=0555 -file path=opt/onbld/bin/sccshist mode=0555 -file path=opt/onbld/bin/sccsmv mode=0555 -file path=opt/onbld/bin/sccsrm mode=0555 file path=opt/onbld/bin/signit mode=0555 file path=opt/onbld/bin/signproto mode=0555 file path=opt/onbld/bin/validate_flg mode=0555 @@ -135,8 +132,6 @@ file path=opt/onbld/bin/webrev mode=0555 file path=opt/onbld/bin/which_scm mode=0555 file path=opt/onbld/bin/ws mode=0555 file path=opt/onbld/bin/wsdiff mode=0555 -file path=opt/onbld/bin/wx mode=0555 -file path=opt/onbld/bin/wx2hg mode=0555 file path=opt/onbld/bin/xref mode=0555 file path=opt/onbld/bin/xref.mk file path=opt/onbld/env/developer @@ -178,8 +173,6 @@ file path=opt/onbld/lib/python2.4/onbld/Checks/Mapfile.py mode=0444 file path=opt/onbld/lib/python2.4/onbld/Checks/Mapfile.pyc mode=0444 file path=opt/onbld/lib/python2.4/onbld/Checks/ProcessCheck.py mode=0444 file path=opt/onbld/lib/python2.4/onbld/Checks/ProcessCheck.pyc mode=0444 -file path=opt/onbld/lib/python2.4/onbld/Checks/Rti.py mode=0444 -file path=opt/onbld/lib/python2.4/onbld/Checks/Rti.pyc mode=0444 file path=opt/onbld/lib/python2.4/onbld/Checks/__init__.py mode=0444 file path=opt/onbld/lib/python2.4/onbld/Checks/__init__.pyc mode=0444 file path=opt/onbld/lib/python2.4/onbld/Scm/Backup.py mode=0444 @@ -217,8 +210,6 @@ file path=opt/onbld/lib/python2.6/onbld/Checks/Mapfile.py mode=0444 file path=opt/onbld/lib/python2.6/onbld/Checks/Mapfile.pyc mode=0444 file path=opt/onbld/lib/python2.6/onbld/Checks/ProcessCheck.py mode=0444 file path=opt/onbld/lib/python2.6/onbld/Checks/ProcessCheck.pyc mode=0444 -file path=opt/onbld/lib/python2.6/onbld/Checks/Rti.py mode=0444 -file path=opt/onbld/lib/python2.6/onbld/Checks/Rti.pyc mode=0444 file path=opt/onbld/lib/python2.6/onbld/Checks/__init__.py mode=0444 file path=opt/onbld/lib/python2.6/onbld/Checks/__init__.pyc mode=0444 file path=opt/onbld/lib/python2.6/onbld/Scm/Backup.py mode=0444 @@ -257,17 +248,12 @@ file path=opt/onbld/man/man1/ndrgen.1 file path=opt/onbld/man/man1/nightly.1 file path=opt/onbld/man/man1/onu.1 file path=opt/onbld/man/man1/sccscheck.1 -file path=opt/onbld/man/man1/sccscp.1 -file path=opt/onbld/man/man1/sccsmv.1 -file path=opt/onbld/man/man1/sccsrm.1 file path=opt/onbld/man/man1/signit.1 file path=opt/onbld/man/man1/signproto.1 file path=opt/onbld/man/man1/webrev.1 file path=opt/onbld/man/man1/which_scm.1 file path=opt/onbld/man/man1/ws.1 file path=opt/onbld/man/man1/wsdiff.1 -file path=opt/onbld/man/man1/wx.1 -file path=opt/onbld/man/man1/wx2hg.1 file path=opt/onbld/man/man1/xref.1 file path=opt/onbld/man/sman1/get_depend_info.1 file path=opt/onbld/man/sman1/make_pkg_db.1 diff --git a/usr/src/tools/README.tools b/usr/src/tools/README.tools index 5b3ec3a7de..6cb51f028a 100644 --- a/usr/src/tools/README.tools +++ b/usr/src/tools/README.tools @@ -225,9 +225,6 @@ interface_cmp lintdump dumps the contents of one or more lint libraries; see lintdump(1) -keywords - checks files for proper SCCS keywords. - ndrgen Network Data Language (NDL) RPC protocol compiler to support DCE RPC/MSRPC and SMB/CIFS. ndrgen takes an input protocol definition @@ -256,27 +253,6 @@ protocmp.terse protolist create a list of what's in the proto area, to feed to protocmp. -rtichk - checks that a set of CRs have approved RTIs. Primarily used - by wx - -sccscp - copy a file under SCCS control to another location in a workspace. - also updates teamware's nametable. - -sccshist - Display the history, comments and diffs, of a file under SCCS - control. - -sccsmv - rename a file under SCCS control to another location in a workspace. - also updates teamware's nametable. - -sccsrm - delete a file under SCCS control workspace. also updates teamware's - nametable. Actually renames it to .del--`date` so that others - will see it move when it is brought over (in case they were working - on it). ws creates a shell with the environment set up to build in the given @@ -284,14 +260,6 @@ ws to pull headers and libraries from the proto area of the parent if they aren't in the childs proto area. -wx - A great workspace tool by bonwick. See wx.README for information - and warnings. - -wx2hg - Converts a TeamWare workspace under the control of wx to a - Mercurial workspace, discarding intermediate deltas. - tokenize Used to build the sun4u boot block. @@ -344,6 +312,6 @@ Files you have to update to add a tool 1. Add the tool in its appropriate place. 2. Update the Makefile as required. -3. Update usr/src/tools/SUNWonbld/prototype_*. +3. Update usr/src/pkg/manifests/developer-build-onbld.mf 4. Update usr/src/tools/README.tools (this file). 5. Repeat 1-4 for any man pages. diff --git a/usr/src/tools/onbld/Checks/Comments.py b/usr/src/tools/onbld/Checks/Comments.py index 8583acc159..daf6aa47d9 100644 --- a/usr/src/tools/onbld/Checks/Comments.py +++ b/usr/src/tools/onbld/Checks/Comments.py @@ -25,46 +25,46 @@ # Use is subject to license terms. # +# Copyright 2007, 2010 Richard Lowe + # # Check delta comments: # - Have the correct form. -# - Have a synopsis matching that of the CR or ARC case. +# - Have a synopsis matching that of the bug # - Appear only once. # import re, sys -from onbld.Checks.DbLookups import BugDB, ARC +from onbld.Checks.DbLookups import BugDB + -arcre = re.compile(r'^([A-Z][A-Z]*ARC[/ \t][12]\d{3}/\d{3}) (.*)$') -bugre = re.compile(r'^(\d{7}) (.*)$') +bugre = re.compile(r'^(\d{2,7}) (.*)$') -def isARC(comment): - return arcre.match(comment) def isBug(comment): return bugre.match(comment) -# -# Translate any acceptable case number format into " /" -# format. -# -def normalize_arc(caseid): - return re.sub(r'^([A-Z][A-Z]*ARC)[/ \t]', '\\1 ', caseid) -def comchk(comments, check_db=True, output=sys.stderr, arcPath=None): +def comchk(comments, check_db=True, output=sys.stderr): '''Validate checkin comments against ON standards. Comments must be a list of one-line comments, with no trailing newline. - - If check_db is True (the default), validate CR and ARC - synopses against the databases. + + If check_db is True (the default), validate bug synopses against the + databases. Error messages intended for the user are written to output, which defaults to stderr ''' - bugnospcre = re.compile(r'^(\d{7})([^ ].*)') - ignorere = re.compile(r'^(Portions contributed by |Contributed by |back[ -]?out )') + bugnospcre = re.compile(r'^(\d{2,7})([^ ].*)') + ignorere = re.compile(r'^(' + + r'Portions contributed by|' + + r'Contributed by|' + + r'Reviewed[ -]by|' + + r'Approved[ -]by|' + + r'back[ -]?out)' + + r'[: ]') errors = { 'bugnospc': [], 'mutant': [], @@ -72,7 +72,6 @@ def comchk(comments, check_db=True, output=sys.stderr, arcPath=None): 'nomatch': [], 'nonexistent': [] } bugs = {} - arcs = {} ret = 0 blanks = False @@ -109,13 +108,6 @@ def comchk(comments, check_db=True, output=sys.stderr, arcPath=None): errors['bugnospc'].append(com) continue - # ARC case - match = arcre.search(com) - if match: - arc, case = re.split('[/ \t]', match.group(1), 1) - arcs.setdefault((arc, case), []).append(match.group(2)) - continue - # Anything else is bogus errors['mutant'].append(com) @@ -146,35 +138,6 @@ def comchk(comments, check_db=True, output=sys.stderr, arcPath=None): errors['nomatch'].append([crid, synopsis, entered]) - if check_db: - valid = ARC(arcs.keys(), arcPath) - - for case, insts in arcs.iteritems(): - if len(insts) > 1: - errors['dup'].append(' '.join(case)) - - if not check_db: - continue - - if not case in valid: - errors['nonexistent'].append(' '.join(case)) - continue - - # - # We first try a direct match between the actual case name - # and the entered comment. If that fails we remove a possible - # trailing (fix nit)-type comment, and re-try. - # - for entered in insts: - if entered == valid[case]: - break - else: - # Try again with trailing (fix ...) removed. - dbcom = re.sub(r' \([^)]+\)$', '', entered) - if dbcom != valid[case]: - errors['nomatch'].append( - [' '.join(case), valid[case], - entered]) if blanks: output.write("WARNING: Blank line(s) in comments\n") @@ -196,23 +159,22 @@ def comchk(comments, check_db=True, output=sys.stderr, arcPath=None): if errors['mutant']: ret = 1 - output.write("These comments are neither bug nor ARC case:\n") + output.write("These comments are not valid bugs:\n") for com in errors['mutant']: output.write(" %s\n" % com) if errors['nonexistent']: ret = 1 - output.write("These bugs/ARC cases were not found in the " - "databases:\n") + output.write("These bugs were not found in the databases:\n") for id in errors['nonexistent']: output.write(" %s\n" % id) if errors['nomatch']: ret = 1 - output.write("These bugs/ARC case synopsis/names don't match " + output.write("These bug synopses don't match " "the database entries:\n") for err in errors['nomatch']: - output.write("Synopsis/name of %s is wrong:\n" % err[0]) + output.write("Synopsis of %s is wrong:\n" % err[0]) output.write(" should be: '%s'\n" % err[1]) output.write(" is: '%s'\n" % err[2]) diff --git a/usr/src/tools/scripts/rtichk.py b/usr/src/tools/onbld/Checks/Copyright.py similarity index 50% rename from usr/src/tools/scripts/rtichk.py rename to usr/src/tools/onbld/Checks/Copyright.py index 0bbfa04b3f..81a80058aa 100644 --- a/usr/src/tools/scripts/rtichk.py +++ b/usr/src/tools/onbld/Checks/Copyright.py @@ -1,4 +1,4 @@ -#!/usr/bin/python2.4 +#! /usr/bin/python # # CDDL HEADER START # @@ -24,38 +24,40 @@ # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. # -# -# Check each bug referenced in a comments list (from stdin) has a valid RTI -# +# Copyright 2008, 2010, Richard Lowe -import sys, os, getopt +# Make sure there is a copyright claim for the current year. -sys.path.insert(1, os.path.join(os.path.dirname(__file__), "..", "lib", - "python%d.%d" % sys.version_info[:2])) +import time, re, sys -# Allow running from the source tree, using the modules in the source tree -sys.path.insert(2, os.path.join(os.path.dirname(__file__), '..')) +def err(stream, msg, fname): + stream.write("%s: %s\n" % (fname, msg)) -from onbld.Checks.Rti import rti +def is_copyright(line): + return re.search(r'Copyright (?!\[yyyy\])', line) +def is_current_copyright(line): + return re.search(r'Copyright.*\b%s\b' % time.strftime('%Y'), line) -def usage(): - print 'usage: rtichk [-g gate] [-c consolidation] bugids...' - sys.exit(2) +def copyright(fh, filename=None, output=sys.stderr): + ret = rights = goodrights = 0 -try: - opts, bugs = getopt.getopt(sys.argv[1:], "c:g:r:t:") -except getopt.GetoptError: - usage() - sys.exit(2) + if not filename: + filename = fh.name -gate = None -consolidation = None + for line in fh: + if is_copyright(line): + rights += 1 + if is_current_copyright(line): + goodrights += 1 + break -for opt, arg in opts: - if opt == '-c': consolidation = arg - elif opt == '-g': gate = arg + if rights == 0: + err(output, "no copyright message found", filename) + ret = 1 + elif goodrights == 0: + err(output, "no copyright claim for current year found", + filename) + ret = 1 -ret = not rti(bugs, consolidation=consolidation, gatePath=gate, - output=sys.stdout) -sys.exit(ret) + return ret diff --git a/usr/src/tools/onbld/Checks/DbLookups.py b/usr/src/tools/onbld/Checks/DbLookups.py dissimilarity index 74% index e474b404e6..331dc68090 100644 --- a/usr/src/tools/onbld/Checks/DbLookups.py +++ b/usr/src/tools/onbld/Checks/DbLookups.py @@ -1,487 +1,176 @@ -#! /usr/bin/python -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# - -# -# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. -# - -# -# Various database lookup classes/methods, i.e.: -# * monaco -# * bugs.opensolaris.org (b.o.o.) -# * arc.opensolaris.org/cgi-bin/arc.cgi (for ARC off SWAN) -# * candi.sfbay.sun.com/cgi-bin/arc.cgi (for ARC on SWAN) -# - -import csv -import re -import urllib -import urllib2 -import htmllib -import os -from socket import socket, AF_INET, SOCK_STREAM - -from onbld.Checks import onSWAN - -class NonExistentBug(Exception): - def __str__(self): - return "Bug %s does not exist" % (Exception.__str__(self)) - -class BugDBException(Exception): - def __str__(self): - return "Unknown bug database: %s" % (Exception.__str__(self)) - -class BugDB(object): - """Lookup change requests. - - Object can be used on or off of SWAN, using either monaco or - bugs.opensolaris.org as a database. - - Usage: - bdb = BugDB() - r = bdb.lookup("6455550") - print r["6455550"]["synopsis"] - r = bdb.lookup(["6455550", "6505625"]) - print r["6505625"]["synopsis"] - """ - - def __init__(self, priority = ("bugster",), forceBoo=False): - """Create a BugDB object. - - Keyword argument: - forceBoo: use b.o.o even from SWAN (default=False) - priority: use bug databases in this order - """ - self.__validBugDB = ["bugster"] - self.__onSWAN = not forceBoo and onSWAN() - for database in priority: - if database not in self.__validBugDB: - raise BugDBException, database - self.__priority = priority - - - def __boobug(self, cr): - cr = str(cr) - url = "http://bugs.opensolaris.org/view_bug.do" - req = urllib2.Request(url, urllib.urlencode({"bug_id": cr})) - results = {} - try: - data = urllib2.urlopen(req).readlines() - except urllib2.HTTPError, e: - if e.code != 404: - print "ERROR: HTTP error at " + \ - req.get_full_url() + \ - " got error: " + str(e.code) - raise e - else: - raise NonExistentBug - except urllib2.URLError, e: - print "ERROR: could not connect to " + \ - req.get_full_url() + \ - ' got error: "' + e.reason[1] + '"' - raise e - htmlParser = htmllib.HTMLParser(None) - metaHtmlRe = re.compile(r'^$') - for line in data: - m = metaHtmlRe.search(line) - if not m: - continue - val = urllib.unquote(m.group(2)) - htmlParser.save_bgn() - htmlParser.feed(val) - results[m.group(1)] = htmlParser.save_end() - htmlParser.close() - - if "synopsis" not in results: - raise NonExistentBug(cr) - - results["cr_number"] = cr - results["sub_category"] = results.pop("subcategory") - results["status"] = results.pop("state") - results["date_submitted"] = results.pop("submit_date") - - return results - - - def __monaco(self, crs): - """Return all info for requested change reports. - - Argument: - crs: list of change request ids - - Returns: - Dictionary, mapping CR=>dictionary, where the nested dictionary - is a mapping of field=>value - """ - - # - # See if 'maxcrs' for maximal batch query size is defined - # if not, default to 200. - # This clears the 2499 chars query limit - # - try: - maxcrs - except NameError: - maxcrs = 200 - - i = 0 - results = {} - data = [] - - while i < len(crs): - if len(crs) < ( i + maxcrs ): - j = len(crs) - else: - j = i + maxcrs - - crstmp=crs[i:j] - - # - # We request synopsis last, and split on only - # the number of separators that we expect to - # see such that a | in the synopsis doesn't - # throw us out of whack. - # - monacoFields = [ "cr_number", "category", "sub_category", - "area", "release", "build", "responsible_manager", - "responsible_engineer", "priority", "status", "sub_status", - "submitted_by", "date_submitted", "synopsis" ] - cmd = [] - cmd.append("set What = cr." + ', cr.'.join(monacoFields)) - cmd.append("") - cmd.append("set Which = cr.cr_number in (" + ','.join(crstmp) +")") - cmd.append("") - cmd.append("set FinalClauses = order by cr.cr_number") - cmd.append("") - cmd.append("doMeta genQuery cr") - url = "http://hestia.sfbay.sun.com/cgi-bin/expert?format=" - url += "Pipe-delimited+text;Go=2;no_header=on;cmds=" - url += urllib.quote_plus("\n".join(cmd)) - try: - data += urllib2.urlopen(url).readlines() - except urllib2.HTTPError, e: - print "ERROR: HTTP error at " + url + \ - " got error: " + str(e.code) - raise e - - except urllib2.URLError, e: - print "ERROR: could not connect to " + url + \ - ' got error: "' + e.reason[1] + '"' - raise e - - i += maxcrs - - for line in data: - line = line.rstrip('\n') - values = line.split('|', len(monacoFields) - 1) - v = 0 - cr = values[0] - results[cr] = {} - for field in monacoFields: - results[cr][field] = values[v] - v += 1 - - - return results - - def lookup(self, crs): - """Return all info for requested change reports. - - Argument: - crs: one change request id (may be integer, string, or list), - or multiple change request ids (must be a list) - - Returns: - Dictionary, mapping CR=>dictionary, where the nested dictionary - is a mapping of field=>value - """ - results = {} - if not isinstance(crs, list): - crs = [str(crs)] - for database in self.__priority: - if database == "bugster": - if self.__onSWAN: - results.update(self.__monaco(crs)) - # else we're off-swan and querying via boo, which we can - # only do one bug at a time - else: - for cr in crs: - cr = str(cr) - try: - results[cr] = self.__boobug(cr) - except NonExistentBug: - continue - - # the CR has already been found by one bug database - # so don't bother looking it up in the others - for cr in crs: - if cr in results: - crs.remove(cr) - - return results -#################################################################### -class ARCException(Exception): - """This covers arc.cgi script failure.""" - def __str__(self): - return "Error retrieving ARC data: %s" % (Exception.__str__(self)) - -def ARC(arclist, arcPath=None): - if not arcPath: - if onSWAN(): - arcPath = "http://candi.sfbay.sun.com/cgi-bin/arc.cgi" - else: - arcPath = "http://arc.opensolaris.org/cgi-bin/arc.cgi" - fields = ["present", "arc", "year", "case", "status", "title"] - opts = [("case", "%s/%s" % (a, c)) for a, c in arclist] - req = urllib2.Request(arcPath, urllib.urlencode(opts)) - try: - data = urllib2.urlopen(req).readlines() - except urllib2.HTTPError, e: - print "ERROR: HTTP error at " + req.get_full_url() + \ - " got error: " + str(e.code) - raise e - - except urllib2.URLError, e: - print "ERROR: could not connect to " + req.get_full_url() + \ - ' got error: "' + e.reason[1] + '"' - raise e - ret = {} - for line in csv.DictReader(data, fields): - if line["present"] == "exists": - yc = "%s/%s" % (line["year"], line["case"]) - ret[(line["arc"], yc)] = line["title"] - elif line["present"] == "fatal": - raise ARCException(line["arc"]) - - return ret - -#################################################################### - -# Pointers to the webrti server hostname & port to use -# Using it directly is probably not *officially* supported, so we'll -# have a pointer to the official `webrticli` command line interface -# if using a direct socket connection fails for some reason, so we -# have a fallback -WEBRTI_HOST = 'webrti.sfbay.sun.com' -WEBRTI_PORT = 9188 -WEBRTICLI = '/net/onnv.sfbay.sun.com/export/onnv-gate/public/bin/webrticli' - - -class RtiException(Exception): - pass - -class RtiCallFailed(RtiException): - def __str__(self): - return "Unable to call webrti: %s" % (RtiException.__str__(self)) - -class RtiSystemProblem(RtiException): - def __str__(self): - return "RTI status cannot be determined for CR: %s" % (RtiException.__str__(self)) - -class RtiIncorrectCR(RtiException): - def __str__(self): - return "Incorrect CR number specified: %s" % (RtiException.__str__(self)) - -class RtiNotFound(RtiException): - def __str__(self): - return "RTI not found for CR: %s" % (RtiException.__str__(self)) - -class RtiNeedConsolidation(RtiException): - def __str__(self): - return "More than one consolidation has this CR: %s" % (RtiException.__str__(self)) - -class RtiBadGate(RtiException): - def __str__(self): - return "Incorrect gate name specified: %s" % (RtiException.__str__(self)) - -class RtiUnknownException(Exception): - def __str__(self): - return "Unknown webrti return code: %s" % (RtiException.__str__(self)) - -class RtiOffSwan(RtiException): - def __str__(self): - return "RTI status checks need SWAN access: %s" % (RtiException.__str__(self)) - -WEBRTI_ERRORS = { - '1': RtiSystemProblem, - '2': RtiIncorrectCR, - '3': RtiNotFound, - '4': RtiNeedConsolidation, - '5': RtiBadGate, -} - -# Our Rti object which we'll use to represent an Rti query -# It's really just a wrapper around the Rti connection, and attempts -# to establish a direct socket connection and query the webrti server -# directly (thus avoiding a system/fork/exec call). If it fails, it -# falls back to the webrticli command line client. - -returnCodeRe = re.compile(r'.*RETURN_CODE=(\d+)') -class Rti: - """Lookup an RTI. - - Usage: - r = Rti("6640538") - print r.rtiNumber(); - """ - - def __init__(self, cr, gate=None, consolidation=None): - """Create an Rti object for the specified change request. - - Argument: - cr: change request id - - Keyword arguments, to limit scope of RTI search: - gate: path to gate workspace (default=None) - consolidation: consolidation name (default=None) - """ - - bufSz = 1024 - addr = (WEBRTI_HOST, WEBRTI_PORT) - # If the passed 'cr' was given as an int, then wrap it - # into a string to make our life easier - if isinstance(cr, int): - cr = str(cr) - self.__queryCr = cr - self.__queryGate = gate - self.__queryConsolidation = consolidation - - self.__webRtiOutput = [] - self.__mainCR = [] - self.__rtiNumber = [] - self.__consolidation = [] - self.__project = [] - self.__status = [] - self.__rtiType = [] - try: - # try to use a direct connection to the - # webrti server first - sock = socket(AF_INET, SOCK_STREAM) - sock.connect(addr) - command = "WEBRTICLI/1.0\nRTIstatus\n%s\n" % cr - if consolidation: - command += "-c\n%s\n" % consolidation - if gate: - command += "-g\n%s\n" % gate - command += "\n" - sock.send(command) - dataList = [] - # keep receiving data from the socket until the - # server closes the connection - stillReceiving = True - while stillReceiving: - dataPiece = sock.recv(bufSz) - if dataPiece: - dataList.append(dataPiece) - else: - stillReceiving = False - # create the lines, skipping the first - # ("WEBRTCLI/1.0\n") - data = '\n'.join(''.join(dataList).split('\n')[1:]) - except: - if not onSWAN(): - raise RtiOffSwan(cr) - - if not os.path.exists(WEBRTICLI): - raise RtiCallFailed('not found') - - # fallback to the "supported" webrticli interface - command = WEBRTICLI - if consolidation: - command += " -c " + consolidation - if gate: - command += " -g " + gate - command += " RTIstatus " + cr - - try: - cliPipe = os.popen(command) - except: - # we couldn't call the webrticli for some - # reason, so return a failure - raise RtiCallFailed('unknown') - - data = cliPipe.readline() - - # parse the data to see if we got a return code - # if we did, then that's bad. if we didn't, - # then our call was successful - m = returnCodeRe.search(data) - if m: - rc = m.group(1) - # we got a return code, set it in our - # object, set the webRtiOutput for debugging - # or logging, and return a failure - if rc in WEBRTI_ERRORS: - exc = WEBRTI_ERRORS[rc] - if exc == RtiBadGate: - edata = gate - else: - edata = cr - else: - exc = RtiUnknownException - edata = rc - raise exc(edata) - - data = data.splitlines() - # At this point, we should have valid data - for line in data: - line = line.rstrip('\r\n') - self.__webRtiOutput.append(line) - fields = line.split(':') - self.__mainCR.append(fields[0]) - self.__rtiNumber.append(fields[1]) - self.__consolidation.append(fields[2]) - self.__project.append(fields[3]) - self.__status.append(fields[4]) - self.__rtiType.append(fields[5]) - - # accessors in case callers need the raw data - def mainCR(self): - return self.__mainCR - def rtiNumber(self): - return self.__rtiNumber - def consolidation(self): - return self.__consolidation - def project(self): - return self.__project - def status(self): - return self.__status - def rtiType(self): - return self.__rtiType - def queryCr(self): - return self.__queryCr - def queryGate(self): - return self.__queryGate - def queryConsolidation(self): - return self.__queryConsolidation - - # in practice, most callers only care about the following - def accepted(self): - for status in self.__status: - if status != "S_ACCEPTED": - return False - return True - - # for logging/debugging in case the caller wants the raw webrti output - def webRtiOutput(self): - return self.__webRtiOutput - +#! /usr/bin/python +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. +# + +# Copyright 2010, Richard Lowe + +# +# Various database lookup classes/methods, i.e.: +# * monaco +# * bugs.opensolaris.org (b.o.o.) +# * redmine (illumos.org) +# + +import htmllib +import re +import urllib +import urllib2 + +try: # Python >= 2.5 + from xml.etree import ElementTree +except ImportError: + from elementtree import ElementTree + +class NonExistentBug(Exception): + def __str__(self): + return "Bug %s does not exist" % (Exception.__str__(self)) + +class BugDBException(Exception): + def __str__(self): + return "Unknown bug database: %s" % (Exception.__str__(self)) + +class BugDB(object): + """Lookup change requests. + + Usage: + bdb = BugDB() + r = bdb.lookup("6455550") + print r["6455550"]["synopsis"] + r = bdb.lookup(["6455550", "6505625"]) + print r["6505625"]["synopsis"] + """ + + VALID_DBS = ["bugster", "illumos"] + + def __init__(self, priority = ("illumos", "bugster")): + """Create a BugDB object. + + Keyword argument: + priority: use bug databases in this order + """ + for database in priority: + if database not in self.VALID_DBS: + raise BugDBException, database + self.__priority = priority + + + def __illbug(self, cr): + url = "http://illumos.org/issues/%s.xml" % cr + req = urllib2.Request(url) + + try: + data = urllib2.urlopen(req) + except urllib2.HTTPError, e: + if e.code == 404: + raise NonExistentBug(cr) + else: + raise + + bug = ElementTree.parse(data) + + return {'cr_number': bug.find('id').text, + 'synopsis': bug.find('subject').text, + 'status': bug.find('status').attrib['name'] + } + + + def __boobug(self, cr): + cr = str(cr) + url = "http://bugs.opensolaris.org/view_bug.do" + req = urllib2.Request(url, urllib.urlencode({"bug_id": cr})) + results = {} + try: + data = urllib2.urlopen(req).readlines() + except urllib2.HTTPError, e: + if e.code != 404: + print "ERROR: HTTP error at " + \ + req.get_full_url() + \ + " got error: " + str(e.code) + raise e + else: + raise NonExistentBug(cr) + except urllib2.URLError, e: + print "ERROR: could not connect to " + \ + req.get_full_url() + \ + ' got error: "' + e.reason[1] + '"' + raise e + htmlParser = htmllib.HTMLParser(None) + metaHtmlRe = re.compile(r'^$') + for line in data: + m = metaHtmlRe.search(line) + if not m: + continue + val = urllib.unquote(m.group(2)) + htmlParser.save_bgn() + htmlParser.feed(val) + results[m.group(1)] = htmlParser.save_end() + htmlParser.close() + + if "synopsis" not in results: + raise NonExistentBug(cr) + + results["cr_number"] = cr + results["sub_category"] = results.pop("subcategory") + results["status"] = results.pop("state") + results["date_submitted"] = results.pop("submit_date") + + return results + + def lookup(self, crs): + """Return all info for requested change reports. + + Argument: + crs: one change request id (may be integer, string, or list), + or multiple change request ids (must be a list) + + Returns: + Dictionary, mapping CR=>dictionary, where the nested dictionary + is a mapping of field=>value + """ + results = {} + if not isinstance(crs, list): + crs = [str(crs)] + for database in self.__priority: + if database == "bugster": + for cr in crs: + cr = str(cr) + try: + results[cr] = self.__boobug(cr) + except NonExistentBug: + continue + elif database == "illumos": + for cr in crs: + try: + results[str(cr)] = self.__illbug(cr) + except NonExistentBug: + continue + + # the CR has already been found by one bug database + # so don't bother looking it up in the others + for cr in crs: + if cr in results: + crs.remove(cr) + + return results diff --git a/usr/src/tools/onbld/Checks/HdrChk.py b/usr/src/tools/onbld/Checks/HdrChk.py index 32a700a4eb..c2697dcaf2 100644 --- a/usr/src/tools/onbld/Checks/HdrChk.py +++ b/usr/src/tools/onbld/Checks/HdrChk.py @@ -24,8 +24,8 @@ # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -# ident "%Z%%M% %I% %E% SMI" -# + +# Copyright 2008, 2010, Richard Lowe # # Check that header files conform to our standards @@ -68,6 +68,7 @@ # import re, os, sys +from onbld.Checks.Copyright import is_copyright class HeaderFile(object): def __init__(self, fh, filename=None, lenient=False): @@ -120,11 +121,11 @@ class HeaderFile(object): # a match for every possibly valid copyright # notice # - if re.search(r'Copyright (?!\[yyyy\])', line): + if is_copyright(line): self.has_copyright = True line = self.getline() - if re.search(r'Copyright (?!\[yyyy\])', line): + if is_copyright(line): self.has_copyright = True line = self.getline() @@ -170,7 +171,7 @@ def hdrchk(fh, filename=None, lenient=False, output=sys.stderr): if not hdr.has_copyright: err(output, "Missing copyright in opening comment", hdr) ret = 1 - + # # Step 2: # diff --git a/usr/src/tools/onbld/Checks/Makefile b/usr/src/tools/onbld/Checks/Makefile index 4558b4ad26..7a3d2c452b 100644 --- a/usr/src/tools/onbld/Checks/Makefile +++ b/usr/src/tools/onbld/Checks/Makefile @@ -23,6 +23,8 @@ # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. # +# Copyright 2010, Richard Lowe + include $(SRC)/Makefile.master include ../../Makefile.tools @@ -36,9 +38,8 @@ PYSRCS = \ HdrChk.py \ JStyle.py \ Keywords.py \ - Mapfile.py \ + Mapfile.py \ ProcessCheck.py \ - Rti.py \ __init__.py PYOBJS = $(PYSRCS:%.py=%.pyc) diff --git a/usr/src/tools/onbld/Checks/Rti.py b/usr/src/tools/onbld/Checks/Rti.py deleted file mode 100644 index 0dd3ffcaa9..0000000000 --- a/usr/src/tools/onbld/Checks/Rti.py +++ /dev/null @@ -1,153 +0,0 @@ -#! /usr/bin/python -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# - -# -# Copyright 2009 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# - -# -# Check on RTI status for bug IDs passed. -# -# How we obtain the bug IDs will vary per SCM. -# - For Teamware, we want to check the active list comments. -# - For Mercurial, we can check the incoming changegroup (via the -# pretxnchangegroup hook) and abort if necessary -# -# This module is implemented as a generic checking module given a list of -# bug IDs. It can then be wrapped or hooked into whatever SCM with an -# SCM-specific hook to parse and pass the requisite bug IDs -# - -import re, os, sys -from onbld.Checks.DbLookups import Rti, RtiException, RtiNotFound, RtiOffSwan - -opensolarisGateRe = re.compile(r'.*osol[0-9]+-sust$') -patchGateRe = re.compile(r'.*-patch.*') -testGateRe = re.compile(r'.*-(stc2|test)$') - -def rti(bugids, gatePath=None, consolidation=None, - output=sys.stderr): - """Return True iff each of the specified bugids has an approved RTI. - - Required argument: - bugids: list of seven-digit bug ids - - Keyword arguments, used to limit the scope of the RTI search: - gatePath: fully qualified path to gate - consolidation: name of the consolidation - """ - - rtiType = "MarketingRelease" - gateType = "MarketingRelease" - - # Check to see if we were given a gate to lookup with - if gatePath != None: - - # - # The gate name should be the last component of the gate path, - # no matter how it's accessed. - # - # We make a special case for "closed," and check to see if it - # appears to be the "usr/closed" portion of a nested repository. - # In that case, we really want the parent repository name. - # - gatePath = gatePath.rstrip(os.path.sep).split(os.path.sep) - gateName = gatePath[-1] - try: - if gatePath[-2:] == ['usr', 'closed']: - gateName = gatePath[-3] - except IndexError: - pass - - # Is this an OpenSolaris gate? - if opensolarisGateRe.search(gateName): - rtiType = "OpenSolaris" - gateType = "OpenSolaris" - - # Is this a patch gate? - if patchGateRe.search(gateName): - rtiType = "Patch" - gateType = "Patch" - - # Is this a test gate? - if testGateRe.search(gateName): - rtiType = "RTI" - gateType = "RTI" - else: - gateName = None - - # Query RTI if there's a gate - # Check the RTIs, caching them in the 'rtis' dictionary - # We do our error checking/handling here - rtis = {} - badRtis = [] - for cr in bugids: - # If we don't already have an Rti object for this cr cached, - # then go create/query it - if cr not in rtis.keys() + badRtis: - try: - rtis[cr] = Rti(cr, gateName, consolidation) - except RtiOffSwan, e: - output.write("%s\n" % e) - return False - except RtiException, e: - output.write("%s\n" % e) - badRtis.append(cr) - continue - - crRti = rtis[cr] - - # If we've reached this point, then the Rti query succeeded, - # and we didn't get an error back from webrti. There is still - # some sanity checking to be done, however - rtiNumber = crRti.rtiNumber() - rtiType = crRti.rtiType() - - # check to make sure the RTI type matches the gate type - if not gateType in rtiType: - message = "Error: for bug " + cr - for each in rtiNumber: - message += " the RTI " + each + " is of " - message += rtiType[rtiNumber.index(each)] + " type " - message += "but the parent gate " + gateName + " is a " - message += gateType + " gate.\n" + "A " + gateType - message += " RTI must be submitted to putback bug " + cr + " to " - message += gateName + ". \n" - - output.write( message ) - badRtis.append(cr) - continue - - if not crRti.accepted(): - for each in rtiNumber: - message = "Error: RTI " + each + " for CR " + cr + " is not in " - message += "the accepted state.\n" - output.write(message) - badRtis.append(cr) - continue - - if len(badRtis) > 0: - return False - - return True - diff --git a/usr/src/tools/onbld/Checks/__init__.py b/usr/src/tools/onbld/Checks/__init__.py index f85cc4bbba..4bb5f3e262 100644 --- a/usr/src/tools/onbld/Checks/__init__.py +++ b/usr/src/tools/onbld/Checks/__init__.py @@ -25,6 +25,8 @@ # Use is subject to license terms. # +# Copyright 2010, Richard Lowe + # # The 'checks' package contains various checks that may be run # @@ -37,21 +39,4 @@ __all__ = [ 'HdrChk', 'JStyle', 'Keywords', - 'Mapfile', - 'Rti', - 'onSWAN'] - - -import socket - -# -# Generic check to test if a host is on SWAN -# -def onSWAN(): - try: - if socket.gethostbyname("sunweb.central.sun.com."): - return True - else: - return False - except: - return False + 'Mapfile'] diff --git a/usr/src/tools/onbld/hgext/cdm.py b/usr/src/tools/onbld/hgext/cdm.py index 2241519f26..4ee408ec87 100644 --- a/usr/src/tools/onbld/hgext/cdm.py +++ b/usr/src/tools/onbld/hgext/cdm.py @@ -17,6 +17,8 @@ # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. # +# Copyright 2008, 2010, Richard Lowe + '''OpenSolaris workspace extensions for mercurial This extension contains a number of commands to help you work within @@ -67,7 +69,7 @@ from mercurial import cmdutil, ignore, node from onbld.Scm.WorkSpace import ActiveEntry, WorkSpace from onbld.Scm.Backup import CdmBackup from onbld.Checks import Cddl, Comments, Copyright, CStyle, HdrChk -from onbld.Checks import JStyle, Keywords, Mapfile, Rti, onSWAN +from onbld.Checks import JStyle, Keywords, Mapfile def yes_no(ui, msg, default): @@ -249,15 +251,6 @@ def cdm_list(ui, repo, **opts): ui.write('\t%s\n' % elt.name) -def cdm_arcs(ui, repo, parent=None): - 'show all ARC cases in checkin comments' - act = wslist[repo].active(parent) - - # We take a set of the appropriate comments to eliminate duplicates. - for elt in set(filter(Comments.isARC, act.comments())): - ui.write(elt + '\n') - - def cdm_bugs(ui, repo, parent=None): 'show all bug IDs in checkin comments' act = wslist[repo].active(parent) @@ -299,8 +292,7 @@ def cdm_comchk(ui, repo, **opts): ui.write('Comments check:\n') check_db = not opts.get('nocheck') - return Comments.comchk(active.comments(), check_db=check_db, output=ui, - arcPath=ui.config('cdm', 'arcpath', None)) + return Comments.comchk(active.comments(), check_db=check_db, output=ui) def cdm_cddlchk(ui, repo, *args, **opts): @@ -585,35 +577,6 @@ def cdm_branchchk(ui, repo, **opts): return 0 -def cdm_rtichk(ui, repo, **opts): - '''check active bug/RFEs for approved RTIs - - Only works on SWAN.''' - - if opts.get('nocheck') or os.path.exists(repo.join('cdm/rtichk.NOT')): - ui.status('Skipping RTI checks...\n') - return 0 - - if not onSWAN(): - ui.write('RTI checks only work on SWAN, skipping...\n') - return 0 - - parent = wslist[repo].parent(opts.get('parent')) - active = wslist[repo].active(parent) - - ui.write('RTI check:\n') - - bugs = [] - - for com in active.comments(): - match = Comments.isBug(com) - if match and match.group(1) not in bugs: - bugs.append(match.group(1)) - - # RTI normalizes the gate path for us - return int(not Rti.rti(bugs, gatePath=parent, output=ui)) - - def cdm_keywords(ui, repo, *args, **opts): '''check source files do not contain SCCS keywords''' @@ -700,11 +663,10 @@ def run_checks(ws, cmds, *args, **opts): def cdm_nits(ui, repo, *args, **opts): '''check for stylistic nits in active files - Run cddlchk, copyright, cstyle, hdrchk, jstyle, mapfilechk, + Run copyright, cstyle, hdrchk, jstyle, mapfilechk, permchk, and keywords checks.''' - cmds = [cdm_cddlchk, - cdm_copyright, + cmds = [cdm_copyright, cdm_cstyle, cdm_hdrchk, cdm_jstyle, @@ -718,8 +680,8 @@ def cdm_nits(ui, repo, *args, **opts): def cdm_pbchk(ui, repo, **opts): '''pre-putback check all active files - Run cddlchk, comchk, copyright, cstyle, hdrchk, jstyle, mapfilechk, - permchk, tagchk, branchchk, keywords and rtichk checks. Additionally, + Run comchk, copyright, cstyle, hdrchk, jstyle, mapfilechk, + permchk, tagchk, branchchk and keywords checks. Additionally, warn about uncommitted changes.''' # @@ -727,8 +689,7 @@ def cdm_pbchk(ui, repo, **opts): # run first in the same order as they would in cdm_nits. Then the # pbchk specifics run # - cmds = [cdm_cddlchk, - cdm_copyright, + cmds = [cdm_copyright, cdm_cstyle, cdm_hdrchk, cdm_jstyle, @@ -738,7 +699,6 @@ def cdm_pbchk(ui, repo, **opts): cdm_comchk, cdm_tagchk, cdm_branchchk, - cdm_rtichk, cdm_outchk, cdm_mergechk] @@ -1132,8 +1092,6 @@ cmdtable = { 'apply': (cdm_apply, [('p', 'parent', '', 'parent workspace'), ('r', 'remain', None, 'do not change directories')], 'hg apply [-p PARENT] [-r] command...'), - 'arcs': (cdm_arcs, [('p', 'parent', '', 'parent workspace')], - 'hg arcs [-p PARENT]'), '^backup|bu': (cdm_backup, [('t', 'if-newer', None, 'only backup if workspace files are newer')], 'hg backup [-t]'), @@ -1172,7 +1130,7 @@ cmdtable = { '^nits': (cdm_nits, [('p', 'parent', '', 'parent workspace')], 'hg nits [-p PARENT]'), '^pbchk': (cdm_pbchk, [('p', 'parent', '', 'parent workspace'), - ('N', 'nocheck', None, 'skip RTI check')], + ('N', 'nocheck', None, 'skip database checks')], 'hg pbchk [-N] [-p PARENT]'), 'permchk': (cdm_permchk, [('p', 'parent', '', 'parent workspace')], 'hg permchk [-p PARENT]'), @@ -1206,9 +1164,6 @@ cmdtable = { 'reparent': (cdm_reparent, [], 'hg reparent PARENT'), '^restore': (cdm_restore, [('g', 'generation', '', 'generation number')], 'hg restore [-g GENERATION] BACKUP'), - 'rtichk': (cdm_rtichk, [('p', 'parent', '', 'parent workspace'), - ('N', 'nocheck', None, 'skip RTI check')], - 'hg rtichk [-N] [-p PARENT]'), 'tagchk': (cdm_tagchk, [('p', 'parent', '', 'parent workspace')], 'hg tagchk [-p PARENT]'), 'webrev': (cdm_webrev, [('C', 'C', '', 'ITS priority file'), diff --git a/usr/src/tools/scripts/Makefile b/usr/src/tools/scripts/Makefile index c673f11b7d..20f3e34a5b 100644 --- a/usr/src/tools/scripts/Makefile +++ b/usr/src/tools/scripts/Makefile @@ -21,6 +21,7 @@ # # Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. # +# Copyright 2010, Richard Lowe SHELL=/usr/bin/ksh93 @@ -38,21 +39,14 @@ SHFILES= \ flg.flp \ genoffsets \ hgsetup \ - keywords \ mkclosed \ nightly \ onu \ protocmp.terse \ sccscheck \ - sccscp \ - sccshist \ - sccsmv \ - sccsrm \ webrev \ which_scm \ ws \ - wx \ - wx2hg \ xref PERLFILES= \ @@ -78,7 +72,6 @@ PYFILES= \ hdrchk \ hg-active \ mapfilechk \ - rtichk \ validate_pkg \ wsdiff @@ -101,15 +94,10 @@ MAN1FILES= \ nightly.1 \ onu.1 \ sccscheck.1 \ - sccscp.1 \ - sccsmv.1 \ - sccsrm.1 \ webrev.1 \ which_scm.1 \ ws.1 \ wsdiff.1 \ - wx.1 \ - wx2hg.1 \ xref.1 MAKEFILES= \ @@ -152,7 +140,7 @@ clean: bldenv: bldenv.sh stdenv.sh $(RM) "$@" sed -e '/# STDENV_START/ r stdenv.sh' bldenv.sh > "$@" - # Check for shell lint and fail if we hit warings + # Check for shell lint and fail if we hit warnings shlintout="$$( /usr/bin/ksh93 -n "$@" 2>&1 )" ; \ [[ "$${shlintout}" != "" ]] && \ { print -r -- "$${shlintout}" ; false ; } || true diff --git a/usr/src/tools/scripts/hgsetup.sh b/usr/src/tools/scripts/hgsetup.sh index dc0499c467..937b505806 100644 --- a/usr/src/tools/scripts/hgsetup.sh +++ b/usr/src/tools/scripts/hgsetup.sh @@ -25,6 +25,8 @@ # Use is subject to license terms. # +# Copyright 2010, Richard Lowe + # # Easy setup script for populating a user's ~/.hgrc # This currently does the following: @@ -50,12 +52,9 @@ usage() { -p proxy : enable use of web proxy with specified proxy -s style_path : override path to style file - if -e isn't provided, and you are on SWAN, an LDAP query is done if -n isn't provided, the entry from /etc/passwd is used proxy should be in the form of hostname:port - if on-SWAN, $prog will lookup your email address. this can be - overridden by using the -e flag. " exit 1 } @@ -121,19 +120,6 @@ host=$proxy " fi -if getent hosts sunweb.central.sun.com >/dev/null; then - # on SWAN - echo "Detected SWAN connection" - ON_SWAN=1 - ldapemail='preferredrfc822recipient' - ldapquery="uid=$login $ldapemail" - ldapcmd="$LDAPCLIENT -1 -h sun-ds -b dc=sun,dc=com $ldapquery" - if [[ -z "$email" ]]; then - echo "Looking up e-mail address in LDAP" - email=${email:=$($ldapcmd | $AWK /^$ldapemail:/'{print $2}')} - fi -fi - if [[ -z $email ]]; then my_id=$(id -un) my_checkhostname=$(check-hostname) @@ -173,24 +159,9 @@ hgext.cdm=$cdm_path from=$email [paths] -EOF - -if [[ -n $ON_SWAN ]]; then - cat <> $HGRC -onnv-gate=ssh://onnv.sfbay.sun.com//export/onnv-gate -onnv-clone=ssh://onnv.sfbay.sun.com//export/onnv-clone -onnv-closed=ssh://onnv.sfbay.sun.com//export/onnv-gate/usr/closed -onnv-closed-clone=ssh://onnv.sfbay.sun.com//export/onnv-clone/usr/closed - -EOF -else - cat <> $HGRC onnv-gate=ssh://anon@hg.opensolaris.org//hg/onnv/onnv-gate +illumos-gate=http://hg.illumos.org/illumos-gate -EOF -fi - -cat <> $HGRC [merge-tools] filemerge.gui=True filemerge.args=-a \$base \$local \$other \$output diff --git a/usr/src/tools/scripts/its.conf b/usr/src/tools/scripts/its.conf index 2cb704c70e..d56ce0b6b6 100644 --- a/usr/src/tools/scripts/its.conf +++ b/usr/src/tools/scripts/its.conf @@ -24,6 +24,8 @@ # Use is subject to license terms. # +# Copyright 2010, Richard Lowe + # # configuration file for information tracking systems # @@ -31,7 +33,7 @@ # # This setting determines the domain used to resolve internal URLs # -its_domain="sun.com" +its_domain="illumos.org" # # This setting determines the priority with which an application will @@ -40,4 +42,4 @@ its_domain="sun.com" # It should be a list (white space separated) of prefixes # from the corresponding its.reg file. # -its_priority="sun arc doo" +its_priority="illumos sun arc doo" diff --git a/usr/src/tools/scripts/its.reg b/usr/src/tools/scripts/its.reg index 5cd8e8de31..1f40e67fe6 100644 --- a/usr/src/tools/scripts/its.reg +++ b/usr/src/tools/scripts/its.reg @@ -23,7 +23,7 @@ # Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. # - +# Copyright 2010, Richard Lowe # # This file constitutes an informal registry for information tracking @@ -153,3 +153,12 @@ EXTERNAL_URL=http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=\\1 INTERNAL_URL_sun.com=http://monaco.sfbay.sun.com/detail.jsf?cr=\\1 REGEX=\\([0-9]\\{7\\}\\) CONTACT=opendev-discuss@opensolaris.org + +# +# The redmine instance on illumos.org +# +PREFIX=illumos +INFO=http://illumos.org +EXTERNAL_URL=https://illumos.org/issues/\\1 +REGEX=\\([0-9]\\{1\,6\\}\\) +CONTACT=developer@lists.illumos.org diff --git a/usr/src/tools/scripts/keywords.sh b/usr/src/tools/scripts/keywords.sh deleted file mode 100644 index 1ddc6172f6..0000000000 --- a/usr/src/tools/scripts/keywords.sh +++ /dev/null @@ -1,175 +0,0 @@ -#!/bin/sh -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2005 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -#ident "%Z%%M% %I% %E% SMI" -# -# Checks the list of files to make sure that each given file has a SMI -# standard ident string. -# -# It checks that keywords exist, and verifies the string. By default, -# all allowable forms of keywords (according to the ON documentation) -# are acceptable. The '-p' option (pedantic) allows only the canonical -# form of keywords. See below for allowable forms. -# -# Use as "keywords filelist" where filelist is the list of plain files. -# -# However, in general, this utility should not need to be directly -# invoked, but instead used through wx(1) -- e.g., `wx keywords'. -# -# Output consists of filenames with expanded, incorrect or missing -# sccs keywords and/or filenames that were not SCCS files. -# -# Exits with status 0 if all files are sccs files and all files have -# unexpanded, correct keywords. Otherwise, exits with a non-zero status. - -# -# The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout -# under certain circumstances, which can really screw things up; unset it. -# -unset CDPATH - -PATH=/usr/bin:/usr/ccs/bin - -USAGE="usage: `basename $0` [-p] ..." - -# Canonical form for .c and .h files -CANON_C_H="^#pragma ident \"\%\Z\%\%\M\% \%\I\% \%\E\% SMI\"" -# Canonical form for other files -CANON_OTHER="ident \"\%\Z\%\%\M\% \%\I\% \%\E\% SMI\"" -STANDARD="ident \"(\%\Z\%\%\M\% +\%\I\%|\%W\%) +\%\E\% SMI\"" -EXPANDED="@\(#\).*[ ]+[1-9]+(\.[0-9]+)+[ ]+(-[ ]+)?[0-9][0-9]/[01][0-9]/[0-3][0-9][ ]+.*(SMI|Sun)" -LIBERAL="(\%\Z\%\%\M\%[ ]+\%\I\%|\%W\%)[ ]+\%\E\%[ ]+.*(SMI|Sun)" - -check_file() { - fname=$1 - bname=$2 - canon_str=$3 - if [ $pedantic -eq 1 ]; then - egrep -s "$canon_str" $bname - if [ $? -ne 0 ]; then - echo "Incorrect ident string in $fname" - exitcode=1 - fi - elif [ $liberal -eq 1 ]; then - egrep -s "$LIBERAL" $bname - if [ $? -ne 0 ]; then - egrep -s "$EXPANDED" $bname - if [ $? -eq 0 ]; then - echo "Expanded keywords in $fname" - else - echo "Incorrect ident string in $fname" - fi - exitcode=1 - fi - else - egrep -s "$STANDARD" $bname - if [ $? -ne 0 ]; then - egrep -s "$EXPANDED" $bname - if [ $? -eq 0 ]; then - echo "Expanded keywords in $fname" - else - echo "Incorrect ident string in $fname" - fi - exitcode=1 - fi - fi -} - -pedantic=0 -liberal=0 -cwd=`pwd` -exitcode=0 -rm -f /tmp/xxx$$ /tmp/kywrds.$$ -trap "rm -f /tmp/xxx$$ /tmp/kywrds.$$" 0 - -while getopts lp c -do - case $c in - l) liberal=1;; - p) pedantic=1;; - \?) echo $USAGE - exit 2;; - esac -done -shift `expr $OPTIND - 1` - -for i -do - dir=`dirname $i` - file=`basename $i` - - # Try to build the full path to the file argument - echo $dir | egrep -s '^/' - if [ ! $? -eq 0 ]; then - dir=`pwd`/$dir - fi - - cd $dir - - if [ -f SCCS/s.$file ]; then - if [ -f SCCS/p.$file ]; then - case "$file" in - *.cxx|*.cc|*.c|*.hh|*.h) - canon_str="$CANON_C_H";; - *) - canon_str="$CANON_OTHER";; - esac - check_file $i $file "$canon_str" - else - sccs get -p $file > /dev/null 2>/tmp/xxx$$ - if [ $? -ne 0 ]; then - echo "Cannot access SCCS information: $i" - exitcode=1 - continue - fi - egrep -s "cm7" /tmp/xxx$$ - if [ $? -eq 0 ]; then - egrep -s "$EXPANDED" $file - if [ $? -eq 0 ]; then - echo "Expanded keywords in $i" - else - echo "Missing keywords in $i" - fi - exitcode=1 - else - sccs get -p -k $file > /tmp/kywrds.$$ 2>/tmp/xxx$$ - case "$file" in - *.cxx|*.cc|*.c|*.hh|*.h) - canon_str="$CANON_C_H";; - *) - canon_str="$CANON_OTHER";; - esac - check_file $i /tmp/kywrds.$$ "$canon_str" - fi - fi - else - echo "Not an SCCS file: $i" - exitcode=1 - fi - cd $cwd -done - -exit $exitcode diff --git a/usr/src/tools/scripts/sccscp.1 b/usr/src/tools/scripts/sccscp.1 deleted file mode 100644 index 3c3636a3ef..0000000000 --- a/usr/src/tools/scripts/sccscp.1 +++ /dev/null @@ -1,60 +0,0 @@ -.\" ident "%Z%%M% %I% %E% SMI" -.\" -.\" CDDL HEADER START -.\" -.\" The contents of this file are subject to the terms of the -.\" Common Development and Distribution License, Version 1.0 only -.\" (the "License"). You may not use this file except in compliance -.\" with the License. -.\" -.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -.\" or http://www.opensolaris.org/os/licensing. -.\" See the License for the specific language governing permissions -.\" and limitations under the License. -.\" -.\" When distributing Covered Code, include this CDDL HEADER in each -.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. -.\" If applicable, add the following below this CDDL HEADER, with the -.\" fields enclosed by brackets "[]" replaced with your own identifying -.\" information: Portions Copyright [yyyy] [name of copyright owner] -.\" -.\" CDDL HEADER END -.\" -.\" "Copyright 2000 Sun Microsystems, Inc." -.\" "All rights reserved" -.\" "Use is subject to license terms." -.TH sccscp 1 "20 May 1992" -.SH NAME -.I sccscp -\- copy SCCS files under CodeManger control -.SH SYNOPSIS -.B sccscp -[-r] [-g] [-d] filename1 [filename2...] target -.SH DESCRIPTION -.I sccscp -is to be used to duplicate sccs files which are under CodeManager -control. sccscp will copy the files or directories given -on the command line, it will then "uniqueify" -the SMID for the s-dot file. -.LP -.I sccscp -should be used any time your are duplicating part of a workspace -under CodeManager control. -.SH OPTIONS -.TP 10 -.B \-r -If file n is a directory, -.B sccscp -will copy the directory and all its files, including any -subdirectories and their files; -.I target must be a directory. -.TP -.B \-g -Don't do SCCS gets after copying the s-dot files. Normally -g-files are extracted after they are copied. -.TP -.B \-e -Copy most recent delta if file is currently checked out. -.TP -.B \-d -set debug mode. diff --git a/usr/src/tools/scripts/sccscp.sh b/usr/src/tools/scripts/sccscp.sh deleted file mode 100644 index cccd5cc1c7..0000000000 --- a/usr/src/tools/scripts/sccscp.sh +++ /dev/null @@ -1,222 +0,0 @@ -#!/bin/sh -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 1993-1998, 2003 Sun Microsystems, Inc. -# All rights reserved. -# Use is subject to license terms. -# -#pragma ident "%Z%%M% %I% %E% SMI" -# -# This script is to be used to copy SCCS files and SCCS -# directory structures within a CodeManager workspace -# You specify the 'clear file' or directory to sccscp, it -# will duplicate the coresponding s-dot file(s), -# and do an SCCS GET operation on the newly -# created s-dot file. -# -# - -# -# The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout -# under certain circumstances, which can really screw things up; unset it. -# -unset CDPATH - -R_FLAG=0 -G_FLAG=0 -E_FLAG=0 - -usage() -{ - echo "usage: sccscp [-r] filename1 [ filename2...] target" - echo " -r copy a directory and all of its files" - echo " -g copy the sdot file, but do not sccs-get it" - echo " -e copy most recent delta if file is currently checked out." - echo " -d debug mode" -} #usage() - - -# -# function to return that last arguement passed to it. -# I use this in place of array indexing - which shell -# does not do well. -# -getlast() -{ - for arg in $* - do - : - done - echo "$arg" -} # getlast() - - - -# -# copy_file(source, destination) -# -copy_file() -{ - f1=`basename $1` - d1=`dirname $1` - s1="$d1/SCCS/s.$f1" - p1="$d1/SCCS/p.$f1" - f2=`basename $2` - d2=`dirname $2` - s2="$d2/SCCS/s.$f2" - # - # is the file currently checked out? - # - if [ "(" -f $p1 ")" -a "(" $E_FLAG -eq "0" ")" ]; then - echo "sccscp: $f1 currently checked out - not copied" - return - fi - # - # Does the destination directory have an SCCS directory, - # if not we will create it! - # - if [ ! -d $d2/SCCS ]; then - mkdir $d2/SCCS - fi - cp $s1 $s2 - if [ $G_FLAG -eq "0" ]; then - PWD=`pwd` - cd $d2 - echo "sccs get $d2/$f2" - sccs get $f2 - cd $PWD - fi -} # copy_file() - - -# -# copy_dir(source, destination) -# -copy_dir() -{ - PWD=`pwd` - - if [ -d $2 ]; then - destdir=$2/`basename $1` - else - destdir=$2 - fi - - cd $1 - - find . -name "s.*" -print | grep '/SCCS/s\.' \ - | while read sdot - do - sdot=`echo $sdot | sed -e "s/^\.\///"` - d2=$PWD/$destdir/`dirname $sdot` - f2=`basename $sdot | sed -e "s/^s\.//" ` - if [ "(" -f $PWD/$1/`dirname $sdot`/p.$f2 ")" -a \ - "(" $E_FLAG -eq "0" ")" ]; then - d1=`basename $sdot` - d1=`basename $d1` - echo "sccscp: $d1/$f2 currently checked out - not copied" - continue - fi - if [ ! -d $d2 ]; then - mkdir -p $d2 - fi - cp $PWD/$1/$sdot $PWD/$destdir/$sdot - if [ $G_FLAG -eq "0" ]; then - dir=`dirname $destdir/$sdot` - dir=`dirname $dir` - cd $PWD/$dir - echo "sccs get $dir/$f2" - sccs get $f2 - fi - done - - cd $PWD -} # copy_dir() - -if [ -f /usr/sccs/admin ]; then - ADMIN=/usr/sccs/admin - PRS=/usr/sccs/prs -else - ADMIN=/usr/ccs/bin/admin - PRS=/usr/ccs/bin/prs -fi - - -# -# Parse options... -# -set -- `getopt edgr $*` -if [ $? != 0 ]; then - usage - exit 2 -fi - -for i in $* -do - case $i in - -r) R_FLAG=1; shift;; - -d) set -x; shift;; - -g) G_FLAG=1; shift;; - -e) E_FLAG=1; shift;; - --) shift; break;; - esac -done - -if [ $# -lt 2 ]; then - echo "sccscp: Insufficient arguments (${#})" - usage - exit 1 -fi - -lastarg=`getlast $*` - -if [ "(" $# -gt 2 ")" -a "(" ! -d $lastarg ")" ]; then - echo "sccscp: Target must be a directory" - usage - exit 1 -fi - -while [ $# -gt 1 ] -do - if [ ! -r $1 ]; then - echo "sccscp: cannot access $1" - shift - continue - fi - if [ -d $lastarg ]; then - dest=$lastarg/`basename $1` - else - dest=$lastarg - fi - if [ -d $1 ]; then - if [ $R_FLAG -eq 0 ]; then - echo "sccscp: <$1> directory" - else - copy_dir $1 $dest - fi - else - copy_file $1 $dest - fi - shift -done - diff --git a/usr/src/tools/scripts/sccshist.sh b/usr/src/tools/scripts/sccshist.sh deleted file mode 100644 index d3597358dd..0000000000 --- a/usr/src/tools/scripts/sccshist.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/bin/ksh -p -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2003 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -#ident "%Z%%M% %I% %E% SMI" -# -# Print sccs history of a file with -# comment and differences for each delta. -# -# With the -r invocation style, only the deltas between the given sids are -# printed. sccshist -r1.2 -r1.3, for example, prints the SID description for -# 1.3, followed by the diffs between 1.2 and 1.3. The SID description for 1.2 -# is not printed. -# -# With the -n invocation style, deltas to a given number of SIDs are printed. -# Given a file with 1.5, 1.4, ... 1.1, sccshist -n 2 will print the 1.5 SID -# header, 1.4 -> 1.5 diffs, the 1.4 SID header, and 1.3 -> 1.4 diffs. -# - -PROGNAME=$(basename "$0") - -SCCS=/usr/ccs/bin/sccs - -die() -{ - echo "$PROGNAME: $@" >&2 - exit 1 -} - -usage() -{ - echo "Usage: $PROGNAME [-c|-u] [-r lowsid [-r highsid]] file" >&2 - echo " $PROGNAME [-c|-u] [-n nsids] file" >&2 - exit 2 -} - -lowsid= -highsid= -typeset -i nsids=0 -diffflags= - -while getopts "cn:r:u" c ; do - case $c in - c|u) - [[ -n "$diffflags" ]] && usage - diffflags="-$c" - ;; - n) - expr "X$OPTARG" : 'X[0-9]*$' >/dev/null || usage - nsids="$OPTARG" - ;; - r) - if [[ -n "$highsid" ]] ; then - usage - elif [[ -n "$lowsid" ]] ; then - highsid="$OPTARG" - else - lowsid="$OPTARG" - fi - ;; - *) - usage - ;; - esac -done -shift $(($OPTIND - 1)) - -[[ -n "$lowsid" && $nsids -ne 0 ]] && usage -[[ $# -ne 1 ]] && usage - -FILE=$1 - -[[ -r "$FILE" ]] || die "failed to open $FILE" - -tmpf1=/tmp/sid1.$$ -tmpf2=/tmp/sid2.$$ -trap "rm -f $tmpf1 $tmpf2 ; exit" 0 1 2 3 15 - -# -# The main processing loop. A new SID triggers a printing of the diffs between -# the new SID and the last one. If there is no previous SID (if we're looking -# at the first one), no diff is printed. -# -if [[ -z "$highsid" ]] ; then - printing=1 -else - printing=0 -fi - -typeset -i last=0 -typeset -i count=0 - -$SCCS prt $FILE | while read LINE ; do - set - $LINE - - if [[ $printing -eq 0 ]] ; then - if [[ "$2" = "$highsid" ]] ; then - printing=1 - else - continue - fi - fi - - if [[ $1 != "D" ]] ; then - echo "$LINE" - continue - fi - - # We calculate `last' before printing the diff, and defer breaking out - # of the loop until after the diff, because we want to act upon the - # value during the diff. - [[ -n "$lowsid" && $printing -eq 1 && "$2" = "$lowsid" ]] && last=1 - if [[ "$nsids" -ne 0 ]] ; then - count=$(($count + 1)) - [[ $count -gt $nsids ]] && last=1 - fi - - $SCCS get -s -p -k -r$2 $FILE > $tmpf1 - if [[ -r $tmpf2 ]] ; then - diff -wt $diffflags $tmpf1 $tmpf2 - if [[ $last -eq 0 ]] ; then - echo "________________________________________________________" - fi - fi - mv $tmpf1 $tmpf2 - - [[ $last -eq 1 ]] && break - - echo "$LINE" # The new SID delta line -done diff --git a/usr/src/tools/scripts/sccsmv.1 b/usr/src/tools/scripts/sccsmv.1 deleted file mode 100644 index ee04f88789..0000000000 --- a/usr/src/tools/scripts/sccsmv.1 +++ /dev/null @@ -1,39 +0,0 @@ -.\" ident "%Z%%M% %I% %E% SMI" -.\" -.\" CDDL HEADER START -.\" -.\" The contents of this file are subject to the terms of the -.\" Common Development and Distribution License, Version 1.0 only -.\" (the "License"). You may not use this file except in compliance -.\" with the License. -.\" -.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -.\" or http://www.opensolaris.org/os/licensing. -.\" See the License for the specific language governing permissions -.\" and limitations under the License. -.\" -.\" When distributing Covered Code, include this CDDL HEADER in each -.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. -.\" If applicable, add the following below this CDDL HEADER, with the -.\" fields enclosed by brackets "[]" replaced with your own identifying -.\" information: Portions Copyright [yyyy] [name of copyright owner] -.\" -.\" CDDL HEADER END -.\" -.\" "Copyright 2000 Sun Microsystems, Inc." -.\" "All rights reserved" -.\" "Use is subject to license terms." -.TH sccsmv 1 "20 May 1992" -.SH NAME -.I sccsmv -\- move SCCS files under CodeManager control -.SH SYNOPSIS -.B sccsmv -filename1 [ filename2 ...] target -.SH DESCRIPTION -.I sccsmv -is to be used to move SCCS files which are under CodeManager -control. sccsmv will move the the files or directories given -on the command line. You specify the 'clear file' or the -directory to sccsmv, it will move both the 'clear file, the -s-dot file, and if present, the p-dot files to the new location. diff --git a/usr/src/tools/scripts/sccsmv.sh b/usr/src/tools/scripts/sccsmv.sh deleted file mode 100644 index e5f61fa5b9..0000000000 --- a/usr/src/tools/scripts/sccsmv.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/sh -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright (c) 1993-1998 by Sun Microsystems, Inc. -# All rights reserved. -# -#pragma ident "%Z%%M% %I% %E% SMI" -# -# This script is to be used to move SCCS files and SCCS -# directories within a CodeManager workspace. You -# specifiy the 'clear file' or the directory to sccsmv, -# it will move both the 'clear file' and the coresponding -# s-dot, and if present, p-dot files. -# - -USAGE="usage: sccsmv filename1 [filename2 ...] target" - - -# -# function to return that last arguement passed to it. -# I use this in place of array indexing - which shell -# does not do well. -# -getlast() -{ - for arg in $* - do - : - done - echo "$arg" -} # getlast() - -move_file() -{ - f1=`basename $1` - d1=`dirname $1` - s1="$d1/SCCS/s.$f1" - p1="$d1/SCCS/p.$f1" - f2=`basename $2` - d2=`dirname $2` - s2="$d2/SCCS/s.$f2" - p2="$d2/SCCS/p.$f2" - - if [ ! -d $d2/SCCS ]; then - mkdir $d2/SCCS - fi - mv $s1 $s2 - mv $1 $2 - if [ -f $p1 ]; then - mv $p1 $p2 - fi -} #move_file - -if [ $# -lt 2 ]; then - echo "Insufficient arguments ($#)" - echo $USAGE - exit 1 -fi - -lastarg=`getlast $*` - -if [ "(" $# -gt 2 ")" -a "(" ! -d $lastarg ")" ]; then - echo "sccsmv: Target must be a directory" - echo $USAGE - exit 1 -fi - -while [ $# -gt 1 ] -do - if [ ! -r $1 ]; then - echo "sccsmv: cannot access $1" - shift - continue - fi - if [ -d $lastarg ]; then - dest=$lastarg/`basename $1` - else - dest=$lastarg - fi - if [ -d $1 ]; then - mv $1 $dest - else - move_file $1 $dest - fi - shift -done diff --git a/usr/src/tools/scripts/sccsrm.1 b/usr/src/tools/scripts/sccsrm.1 deleted file mode 100644 index 87c01b3114..0000000000 --- a/usr/src/tools/scripts/sccsrm.1 +++ /dev/null @@ -1,46 +0,0 @@ -.\" ident "%Z%%M% %I% %E% SMI" -.\" -.\" CDDL HEADER START -.\" -.\" The contents of this file are subject to the terms of the -.\" Common Development and Distribution License, Version 1.0 only -.\" (the "License"). You may not use this file except in compliance -.\" with the License. -.\" -.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -.\" or http://www.opensolaris.org/os/licensing. -.\" See the License for the specific language governing permissions -.\" and limitations under the License. -.\" -.\" When distributing Covered Code, include this CDDL HEADER in each -.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. -.\" If applicable, add the following below this CDDL HEADER, with the -.\" fields enclosed by brackets "[]" replaced with your own identifying -.\" information: Portions Copyright [yyyy] [name of copyright owner] -.\" -.\" CDDL HEADER END -.\" -.\" "Copyright 2000 Sun Microsystems, Inc." -.\" "All rights reserved" -.\" "Use is subject to license terms." -.TH sccsrm 1 "20 May 1992" -.SH NAME -.I sccsrm -\- remove SCCS files under Avocet control -.SH SYNOPSIS -.B sccsrm -[-f] ... -.SH DESCRIPTION -.I sccsrm -is to be used to remove sccs files which are under Avocet -control. sccsrm will rename the files or directories given -on the command line to the following format: -.LP -.RS 5 -.nf - -> .del---.{pid} -.fi -.RE -.LP -The trailing pid is optional and will only be appended to the filename -if it is required to make a unique .del filename. diff --git a/usr/src/tools/scripts/sccsrm.sh b/usr/src/tools/scripts/sccsrm.sh deleted file mode 100644 index bf52e56830..0000000000 --- a/usr/src/tools/scripts/sccsrm.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/sh -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright (c) 1993-1998 by Sun Microsystems, Inc. -# All rights reserved. -# -#ident "%Z%%M% %I% %E% SMI" -# -# This script is to be used to remove files from any CodeManager -# workspace. It will do this by moving the specified file, -# and its corresponding s-dot file, to a .del--`date` -# format. -# -# The only way to remove files under the CodeManager is -# through the rename mechanism - it is not enough to -# simply 'rm' the file. -# - -USAGE="usage: sccsrm [-f] ..." - -message() { - if [ ${F_FLAG} -eq 0 ]; then - echo "$*" - fi -} - -# -# LC_ALL=C is set so that the this script will work no matter -# which localization you have installed on your machine. Some -# localizations can cause the output of 'date' and other commands -# to vary. -# -LC_ALL="C"; export LC_ALL - -date=`/usr/bin/date +%h-%d-%y` -F_FLAG=0 - - -# -# Parse options... -# -set -- `getopt f $*` -if [ $? != 0 ]; then - echo $USAGE - exit 2 -fi - - -for i in $* -do - case $i in - -f) F_FLAG=1; shift;; - --) shift; break;; - esac -done - -if [ $# -eq 0 ]; then - message $USAGE - exit 1 -fi - -# -# Process s-dot files. -# -for file in $* -do - new_file="${file}-${date}" - # - # if there is a deleted file of the same name we then append the pid - # to the name. - if [ -f SCCS/s..del-${new_file} -o -d .del-${new_file} ]; then - new_file="${new_file}.$$" - fi - if [ -f SCCS/s.$file ]; then - if [ -f SCCS/p.${file} ]; then - if [ ${F_FLAG} -eq 0 ]; then - echo "warning: ${file} is checked out for editing, all edits will be lost - continue (y/n)" - read ans - while [ `expr $ans : "^[YyNn]"` -eq 0 ] - do - echo "warning: ${file} is checked out for editing, all edits will be lost - continue (y/n)" - read ans - done - else - ans="y" - fi - if [ `expr $ans : "^[Yy]"` -eq 1 ]; then - rm -f SCCS/p.${file} - rm -f ${file} - else - continue - fi - fi - if [ -f ${file} ]; then - mv ${file} .del-${new_file} - fi - mv SCCS/s.${file} SCCS/s..del-${new_file} - elif [ -d ${file} -a ${file} != "SCCS" ]; then - mv ${file} .del-${new_file} - else - message "${file}: not an SCCS file" - fi -done - - - diff --git a/usr/src/tools/scripts/webrev.sh b/usr/src/tools/scripts/webrev.sh index ebd6a577af..6ebb650de9 100644 --- a/usr/src/tools/scripts/webrev.sh +++ b/usr/src/tools/scripts/webrev.sh @@ -24,6 +24,8 @@ # Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. # +# Copyright 2008, 2010, Richard Lowe + # # This script takes a file list and a workspace and builds a set of html files # suitable for doing a code review of source changes via a web page. @@ -2773,7 +2775,8 @@ if [[ -z $nflag ]]; then # itsinfo["${p}_URL"]="&" - print "/^${p}[ ]/ { + # The character class below contains a literal tab + print "/^${p}[: ]/ { s;${itsinfo[${p}_REGEX]};${itsinfo[${p}_URL]};g s;^${p};${itsinfo[${p}_INFO]}; }" >> ${its_sed_script} @@ -2785,7 +2788,7 @@ if [[ -z $nflag ]]; then # for p in ${its_priority}; do print "/^${itsinfo[${p}_REGEX]}[ ]/ { - s;${itsinfo[${p}_REGEX]};${itsinfo[${p}_URL]};g + s;^${itsinfo[${p}_REGEX]};${itsinfo[${p}_URL]};g }" >> ${its_sed_script} done fi diff --git a/usr/src/tools/scripts/wx.1 b/usr/src/tools/scripts/wx.1 deleted file mode 100644 index 032dc7271a..0000000000 --- a/usr/src/tools/scripts/wx.1 +++ /dev/null @@ -1,731 +0,0 @@ -.\" CDDL HEADER START -.\" -.\" The contents of this file are subject to the terms of the -.\" Common Development and Distribution License (the "License"). -.\" You may not use this file except in compliance with the License. -.\" -.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -.\" or http://www.opensolaris.org/os/licensing. -.\" See the License for the specific language governing permissions -.\" and limitations under the License. -.\" -.\" When distributing Covered Code, include this CDDL HEADER in each -.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. -.\" If applicable, add the following below this CDDL HEADER, with the -.\" fields enclosed by brackets "[]" replaced with your own identifying -.\" information: Portions Copyright [yyyy] [name of copyright owner] -.\" -.\" CDDL HEADER END -.\" -.\" Copyright 2008 Sun Microsystems, Inc. All rights reserved. -.\" Use is subject to license terms. -.\" -.\" ident "%Z%%M% %I% %E% SMI" -.\" -.TH wx 1 "16 April 2008" -.SH NAME -.I wx -\- tool to track changes to a workspace, follow ON gate rules and much more -.SH SYNOPSIS -\fBwx [ [-D] [sub-command options]]\fP -.LP -.SH DESCRIPTION -.IX "OS-Net build tools" "wx" "" "\fBwx\fP" -.LP -.I wx -is a shell script to help the developer keep track of file changes in a -workspace, follow the ON gate rules and much more. -.LP -Note, it is recommended that you use -.I wx -for all file manipulation instead of using sccs as this allows wx to -automatically track changes in the workspace instead of having to use -the update command. See http://www.opensolaris.org/os/community/on/wx/ -for more information about using wx. - -.\" COMMANDS section -.LP -.SH COMMANDS - -.TP 10 -.B -D -The -D flag turns on debugging for any command. Debugging information -is output to stderr. - -.TP -.B access -shorthand for "wx ws access_control" - -.TP -.B active -alias for list - -.TP -.B apply -apply cmd to all active files; for example, -"wx apply cat" cats every file - -.TP -.B arcs [-u] -display all ARC cases in check-in comments - -.TP -.B args -shorthand for "wx ws args" - -.TP -.B backup [-i|-n|-z|-b|-t] -make backup copies of all active and renamed files and certain -wx state files (active, renamed, *.NOT). - --i: info about backups (backup dir and contents) - --n: no compression - --z: use gzip, faster than bzip2 but less compression. - --b: use bzip2, slower but better compression. -Defaults to the compression of the previous backup. - --t: backup if wx files are newer than last backup. - -.TP -.B bu -alias for backup command - -.TP -.B bugs [-u] [-N] -Display all bugids in check-in comments. See \fBpbcom\fR below for a -description of the flags. - -.TP -.B cddlchk [cddlchk options] -Warn about obsolete or corrupt CDDL blocks in active files. Note that only -files that already contain a CDDL block will be checked unless the '-a' flag -is specified, and that files listed in wx/cddlchk.NOT will be skipped. - -.TP -.B checkin -Alias for delget command. - -.TP -.B checkout -Alias for edit command. - -.TP -.B ci -Alias for checkin command. - -.TP -.B co -Alias for checkout command. - -.TP -.B codereview [-N] [codereview options] -generate environmentally friendly codereview diffs -for all active files. -N indicates that delta -comments shouldn't be included in the output. - -.TP -.B comchk -Warns if the comments' formats break ON rules. In addition, this will -warn if the bug id doesn't match the given synopsis. Note that this -performs a network connection to a server on the SWAN, so this may hang -depending on the availability of the server. Completely detached operation -should fail smoothly (with a warning). - -.TP -.B comments -display check-in comments for active files - -.TP -.B copyright -Warns if there is a problem with the copyright message in active files. -Files listed in wx/copyright.NOT will be skipped. - -.TP -.B create [-(c|C) comment_file] [-f] [-o] file [file ...] -Creates one or more files in the workspace. -(Updates active list) - --c comment_file: see delget. - --C comment_file: see delget. - --f: force create regardless of warnings, -(non-interactive). - --o: also check out file for further editing. - -.TP -.B cstyle -run cstyle over all active .c and .h files. Files listed in wx/cstyle.NOT -will be skipped. - -.TP -.B delete [-f] [file ...] -Delete one or more files from the workspace. -Will delete all files in active list if no file -args. Note, for files brought over from parent, -this command actually moves the file under the -deleted_files/ subdir so it can be recovered. -For new files this command can remove the file -and file history completely. -(Updates active list if file is in there.) - --f : force delete regardless of warnings -(non-interactive) -Warning, this will completely remove new -files from the workspace. The backup -command will be automatically run before -doing delete -f. - -.TP -.B delget [-(c|C) comment_file][-s][-f] [file ...] -Check in all active files or files on command line (will do 'sccs -create' for files without file histories). Check in comments will be -those in active file. See 'wx comments' for more info. - --c comment_file: use comment(s) in specified comment file when creating -file(s). Note, each comment should be on new line, blank lines not -allowed. The comments in the active list will be replaced by the -comments in the comment_file for the files specified or all the entries -in the active list if no files specified. - --C comment_file: Similar to -c but comments are appended to current -active list comments. - --f: force checkin, no checks, non-interactive. -Use this if your sure the files okay to checkin -otherwise this command will check for keyword -problems. - -.TP -.B deltachk -Warns if there is more than one sccs delta in active files (more than 1 -breaks ON rules unless putting back more than 1 bug and then there -should be at most 1 delta per bug if necessary). Files listed in -wx/deltachk.NOT will be skipped. - -.TP -.B diffs [file ...] -show sccs diffs for files (current vs previous version). - -Will show diffs for all active files if no files given on command line. -New files are not shown, use sub-command 'tdiffs' to include new -files. - -Will use WXDIFFCMD environment variable if set. Hint, try: export -WXDIFFCMD="diff -bw -U 5" - -.TP -.B dir -echo the wx directory path ($workspace/wx) - -.TP -.B e -edit the named wx control file, e.g. "wx e active". -The editor is $EDITOR if set, else vi. - -.TP -.B ea -shorthand for "wx e active" (edit active list). -Note, the format for each entry in the active -list is: - -filepath - # no spaces allowed -one or more comment lines # no blank lines between. - # no spaces allowed, ends the entry. - -In general, it is best to only edit the active list to update comments. -Use the other wx commands like edit or create to update the active list -when possible. - -.TP -.B edit [-s] [file ...] -check out either file(s) on command line or all active files if no file -args. (Updates the active list.) - --s: silent, less sccs diagnostic output. This is true for the other -commands that accept the -s flag. - -.TP -.B egrep -see wx grep - -.TP -.B eval -like apply, but more general. In fact, -"wx apply cmd" is implemented internally as -"wx eval 'cmd $file'". When using eval, -you can refer to $dir, $file, $filepath, -$parent, and $workspace. For example: -wx eval 'echo $dir; sccs prt $file | more' -will show the sccs history for each active file, -preceded by its directory. - -.TP -.B extract -Alias for get command. - -.TP -.B fullreview [-N] [codereview options] -generate full codereview diffs for all active files. --N indicates that delta comments shouldn't be included in the output. - -.TP -.B get [-k][-r #][-p] [file ...] -Get a copy of all active files or files on command -line. By default this is a read only version of -the file. Accepts 'sccs get' flags. Here are some -of the more common: - --k: don't expand the sccs ID string - --r #: get specified version # - --p: output to stdout - -.TP -.B grep -search all active files for regular expression; equivalent to "wx eval -\'echo $filepath; grep pattern $file'" - -.TP -.B hdrchk -run 'hdrchk -a' over all active .h files. Warns if header files (.h) do not -conform to ON style rules. Note that this is not the same as running 'make -check' or 'nightly -C', which apply a stricter set of rules to a subset of ON -headers. Skips files in wx/hdrchk.NOT. - -.TP -.B help -print usage message - -.TP -.B info [file ...] -show all info about active files - -.TP -.B init [options] [src-root-dir] -initialize workspace for wx usage - --f(t|q|n): non-interactive mode of update. Use this to keep init from -asking questions. - --ft: thorough update (update both active, -renamed and new lists with all diffs between parent -and current workspace). Can be slow. - --fq: quick update (update active list with files -currently checked out in current workspace). - --fn: no update (just create empty active, -renamed and new lists if they don't exist). - --s: keep active list sorted by default. This will keep the active list -sorted whenever the active list is updated. Must follow one of the --f(t|q|n) args. - -src-root-dir: optional path relative to top of workspace where wx will -search for files. Use "." to set src-root to top of workspace. Default -is usr. - -.TP -.B jstyle -run jstyle over all active .java files. Files listed in wx/jstyle.NOT -will be skipped. - -.TP -.B keywords -run keywords check over all active files. Warns if it find problems -with SCCS keywords. Skips files in wx/keywords.NOT. - -.TP -.B list [-r|-p|-w] -list active files (the ones you are working on) - --r: list only renamed active files. - --p: output list of both active and renamed files -suitable for input to putback. - --w: output list of both active and renamed files -suitable for input to webrev (see wx webrev -subcommand below). - -.TP -.B makestyle -run makestyle over all active Makefiles. - -.TP -.B mv file newfile -Rename file to newfile -(Updates active list with new file name) - -.TP -.B mv newdir -Renames dir or file to newdir. If newdir exists -then dir will be subdir under newdir. Note, -this renames all files in dir and can take a -while if there are a lot of files affected by -the rename. (Updates active list) - -.TP -.B nawk -see wx grep - -.TP -.B new [-t] -List new active files (files that exist in child only) -Note, should be run before reedit (see reedit below). - --t: thorough, does not use new cache (slower but more -accurate if new cache isn't current). - -.TP -.B nits [file ...] -nits checking. Run cstyle, jstyle, hdrchk, copyright, cddlchk, and -keywords over files to which they are applicable (makestyle is not currently -run because it seems to be quite broken -- more noise than data). This is a -subset of pbchk checks suitable for checking files during development. Use -pbchk before doing the final putback. Will run checks on all active files if -no file args. Will skip checks for files listed in wx/nits.NOT. - -.TP -.B out -find all checked-out files in workspace - -.TP -.B outchk -Warns if there are files in the workspace that are checked out that are -not in the active list. These files should either be in the active list -(see the "update -q" command) or they should not be checked out. - -.TP -.B pb -alias for putback. - -.TP -.B pbchk [file ...] -putback check. Run cstyle, jstyle, hdrchk, copyright, cddlchk, keywords, -rmdelchk, deltachk, comchk, rtichk and outchk over all files to which they -are applicable (makestyle is not currently run because it seems to be quite -broken -- more noise than data). Should be run before doing a putback. -Will run checks on all active files if no file args. -Will skip checks for files listed in wx/pbchk.NOT. - -.TP -.B pbcom [-v] [-u] [-N] -display summarized comments suitable for putback -Default is to display only bugs and arc cases. Will -display warnings about non-bug comments to stderr. - --v: display all comments verbatim including non-bug/arc - --u: prevent sorting, order determined by active list. -Hint, putback will accept comments on stdin. - --N: prevent a network lookup to cross-check bugids with their synopses - -.TP -.B pblist -alias for list -p (see above). - -.TP -.B pdiffs [file ...] -show diffs against parent files - -Will show diffs for all active files if no files given on command line. -New files are not shown, use sub-command 'tpdiffs' to include new -files. - -Will use WXDIFFCMD environment variable if set. - -.TP -.B prt [-y] -show SCCS delta history for all active files - --y: only show latest delta entry - -.TP -.B putback [-v] [-N] [other putback flags, see below] -putback active and renamed files. Will use pbcom -output as the putback comments. - --v: pass comments verbatim to putback (see pbcom) - --N: don't cross-check bugids with their synopses (see pbcom) - -Accepts -n, -p, -q putback flags ('man putback' for -more info). - -.TP -.B recheckin -Alias for redelget command. - -.TP -.B recheckout -Alias for reedit command. - -.TP -.B reci -Alias for redelget command. - -.TP -.B reco -Alias for reedit command. - -.TP -.B redelget [-m] [-s] [file ...] -Similar to reedit but the file is checked in when the command is done. -This is the command to use to collapse new files to their initial delta. - -.TP -.B reedit [-m] [-s] [file ...] -Collapse the sccs delta (file history) such that -all changes made to the file in the current -workspace are now in one delta. If no files are -given on command line then all the active files -are processed. The files are left in a checked -out state so you can make further changes if -required. If not, run "wx delget" to check the -files in prior to putback. Note, newly created -files will only have one delta entry after doing -'wx delget'. Run this right after a resolve to -make all your changes look like a single delta. -This eliminates the uninteresting leaf deltas -that arise from resolving conflicts, so your -putbacks do not contain a bunch of noise about -every bringover/resolve you did in the interim. -Accepts the same compression flags as wx backup. -[file ...] reedits files on command line. This -adds files to active list if not already there. - -NOTE: reedit is appropriate for leaf workspaces -ONLY -- applying reedit to an interior-node -workspace would delete all childrens comments -and confuse Teamware tools in general. - -Before using reedit it's a good idea to check -the output of the new command to make sure the -list of new files looks okay. If files show up -as new that are not then DO NOT use the reedit -as it will destroy the file history. - -NOTE: if a file is new, reedit will leave the file checked out. In -order to keep the delta version at 1.1 redelget must be used for -checkin. - --m: only reedit files that have more that one delta as compared to -parent file. New files will be recreated with comment found in active -list. - -.TP -.B renamed [-a|-d|-p] -list locally renamed files. The output format is: -"new_name previous_name". Note, deleted files are -a special case of rename. - --a: list only renamed active files (same as list -r) - --d: list only deleted files - --p: show "new_name parent_name" (Note, parent_name -may not be the same as previous_name) - -.TP -.B reset [-f] [file ...] -Resets file contents and history to that of parent file. If the file -was renamed locally it will be reset to that of the parent. It does not -work on new file (see uncreate). - -NOTE: use with care. If something goes wrong, do a wx restore from the -last backup and copy wx/tmp/nametable.orig to Codemgr_wsdata/nametable. - -.TP -.B resolve [Teamware resolve args] -resolve bringover conflicts and reedit just merged files. See 'man -resolve' for args. - -.TP -.B restore [-f] [backup_dir] -restore a backup in a workspace (restores both active files and performs -file renames associated with that backup). Also restores certain wx -state files (active, renamed, *.NOT, etc...). A path to the directory -containing the backup to restore from can be optionally specified. - --f: non-interactive. Will restore from last backup. - -.TP -.B rm -Alias for delete command. - -.TP -.B rmdelchk -Warns if sccs rmdel was run on active files (This causes Teamware -problems.) Files listed in wx/rmdelchk.NOT will be skipped. - -.TP -.B rtichk -make sure RTI is approved for bugs/rfe's listed in active list comments. -(RTI is Request To Integrate and is filed using rtitool). Will skip rtichk -if wx/rtichk.NOT exists. - -.TP -.B sed -see wx grep - -.TP -.B tdiffs [file ...] -total diffs, similar to the diffs sub-command, except new files are also -included in the output. New files are those listed by 'new' sub-command. - -Will use WXDIFFCMD environment variable if set. - -.TP -.B tpdiffs [file ...] -total parent diffs, similar to the pdiffs sub-command, except new files are -also included in the output. tpdiffs considers a file to be new if it does -not exist in the parent. - -Will use WXDIFFCMD environment variable if set. - -.TP -.B uncheckout -Alias for unedit command. - -.TP -.B unco -Alias for uncheckout command. - -.TP -.B uncreate [-f] [file ...] -Undoes the create of a new file. The file's active list entry, it's -SCCS history and the entry in the workspace nametable will be removed -but the file will stay in the workspace. Will uncreate all new files in -active list if no file argument is specified. - -.TP -.B unedit [-s][-f] [file ...] -Returns file(s) to state prior to edit/checkout Note, files will be -unlocked and any changes made when file was last checked out will be -lost. Unedit all active files if no files listed on command line. -(Updates active list) - --f: force unedit (non-interactive). Will backup if wx files newer -than last backup. - -.TP -.B update [-q|-r] [-s] -Update the active and renamed file lists by appending names of all files -that have been checked out, changed or renamed as compared to the parent -workspace. This is the most accurate way of updating but it is slow. -All files in the workspace must be under SCCS control in order for -update to find them. - -This command will also rename active list file entries if it discovers -that the active file was renamed in the workspace (perhaps as a result -of a bringover). - -Note, this command can be sped up in some cases by setting the PUTBACK -env. variable to use "cm_env -g -o putback". (See -http://webhome.holland.sun.com/casper/ for more info abou the turbo -def.dir.flp tool). - --q: quick update (only updates active list with files currently checked -out in workspace). This is faster but will not update the renamed list -or find files that have been checked-in/delget'ed. It will rename -active entries if it finds they have been renamed in the workspace. - --r: only update the renamed list. Does not update the active list. - --s: sort active list. - -.TP -.B version -print current version of this program - -.TP -.B webrev [webrev-options] -Generates a webrev for active and renamed/deleted files. -Note, uses comments in the active list. This is the -preferred way of reviewing code. -Files listed in wx/webrev.NOT will be skipped. - -.TP -.B ws -cat the named workspace control file, i.e. -$workspace/Codemgr_wsdata/file - -.LP -.SH ENVIRONMENT VARIABLES -.LP -Here is a list environment variables that -.I wx -references and the meaning of each variable. -.LP -.RE -.B BRINGOVER -.RS 5 -Specifies the command wx uses to do a bringover (default is -"bringover"). This is useful if you want to use something like Casper -Dik's turbo-dir.flp scripts as in this example: - -export BRINGOVER='cm_env -g -o bringover' -.LP -.RE -.B PUTBACK -.RS 5 - -Specifies the command wx uses to do the putback (default is "putback"). -This is useful if you want to use something like Casper Dik's -turbo-dir.flp scripts as in this example: - -export PUTBACK='cm_env -g -o putback' -.LP -.RE -.B WXDIFFCMD -.RS 5 -Specifies the diff command and args for the -.I wx -diffs commands like diffs and pdiffs. This is similar to the -CDIFFCMD and UDIFFCMD environment variables that webrev uses. -A good setting is: - -export WXDIFFCMD='diff -bw -U5' -.LP -.RE -.B WXDIR -.RS 5 -Specifies a non-default directory where -.I wx -will store its state files. This is useful when running -.I wx -in a workspace where write permission isn't available or there is an -existing wx directory which should not be modified. For example: - -$ WXDIR=/tmp/my_wxdir wx init -.LP -.RE -.B WXWEBREV -.RS 5 -Specifies the webrev that -.I wx -will use when running the wx webrev subcommand. For example: -$ WXWEBREV=~/bin/webrev wx webrev - -.SH EXAMPLES -.LP -See http://www.opensolaris.org/os/community/on/wx/ for -examples of how to use wx. - -.SH BUGS -.LP -The new wx is slower that the old wx. There are probably ways to make -it faster and hopefully this will be done one day. - -.SH See Also -.LP -teamware, workspace, putback, sccs, webrev diff --git a/usr/src/tools/scripts/wx.sh b/usr/src/tools/scripts/wx.sh deleted file mode 100644 index d8dc0203d0..0000000000 --- a/usr/src/tools/scripts/wx.sh +++ /dev/null @@ -1,5079 +0,0 @@ -#!/bin/ksh -p -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# - -# -# Copyright 2009 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# - -# wx -- workspace extensions. Jeff Bonwick, December 1992. - -# The bugster cat/subcat = consolidation/os-net-tools - -version() { - if [[ $(whence $0) = "/opt/onbld/bin/wx" ]] && \ - pkginfo SUNWonbld > /dev/null 2>&1; then - pkginfo -l SUNWonbld | egrep "PKGINST:|VERSION:|PSTAMP:" - else - ls -l $(whence $0) - fi -} - -ring_bell() { - # Sound bell to stderr, no newline - print -u2 "\007\c" -} - -fail() { - ring_bell - # output error message to stderr - print -u2 "$@ Aborting $command." - exit 1 -} - -ask() { - typeset question=$1 default_answer=$2 - if [ -z "$default_answer" ]; then - echo "$question \c" - else - echo "$question [$default_answer]: \c" - fi - read answer - [ -z "$answer" ] && answer="$default_answer" -} - -yesno() { - typeset question="$1" - answer= - while [ -z "$answer" ]; do - ask "$question" y/n - case $answer in - y|yes) answer=yes;; - n|no) answer=no;; - *) answer=;; - esac - done -} - -ok_to_proceed() { - yesno "$*" - if [[ "$answer" == no ]]; then - echo "Exiting, no action performed" - exit 1 - fi -} - -escape_re() { - # Escape the . so they are treated as literals in greps. - echo "$1"|sed 's{\.{\\.{g' -} - -remove_local_nt_entry() { - # remove entries in local nt cache - grep -v "^$(escape_re $1) " $wxdir/local_nametable > \ - $wxtmp/local_nametable - [[ ! -f $wxtmp/local_nametable ]] && \ - fail "Error: cannot create $wxtmp/local_nametable" - mv -f $wxtmp/local_nametable $wxdir/local_nametable || - fail "Error: cannot create $wxdir/local_nametable." -} - -remove_renamed_entry() { - # remove entries in renamed list - # assuming arg is the new filename to remove - grep -v "^$(escape_re $1) " $wxdir/renamed > \ - $wxtmp/renamed - [[ ! -f $wxtmp/renamed ]] && fail "Error: cannot create $wxtmp/renamed" - mv -f $wxtmp/renamed $wxdir/renamed || - fail "Error: mv -f $wxtmp/renamed $wxdir/renamed failed" -} - -add_local_nt_entry() { - # Add workspace nametable entry to local nt cache for better perf. - [[ -r $wsdata/nametable ]] || return 0 - if ! grep -q "^$(escape_re $1) " $wxdir/local_nametable; then - # add entries from workspace nt to local nt cache - grep "^$(escape_re $1) " $wsdata/nametable >> \ - $wxdir/local_nametable - [[ ! -f $wxdir/local_nametable ]] && \ - fail "Error: cannot create $wxdir/local_nametable" - fi - return 0 -} - -remove_active_entry() { - # Remove entry from active list - # $1 is the filepath to remove - - nawk ' - $1 == target { - # Get past filepath line - while(NF > 0) - getline; - # Get past blank lines - while(NF == 0) - getline; - # Get past comments - while(NF > 0) - getline; - # Get past ending blank lines - while(NF == 0) { - if (getline) { - continue; - } else { - next; - } - } - } - # print the other active list entries - { print $0; } ' target=$1 $wxdir/active >$wxtmp/tmp_active || - fail "Error: cannot create $wxtmp/tmp_active." - if mv -f $wxtmp/tmp_active $wxdir/active; then - echo "$1 removed from active list." - remove_local_nt_entry $1 - else - cat >&2 <<-EOF -An error occured trying to remove $1 from the active list. -The active list may be corrupt. You should check it out and -possibly run '$ME update' to fix. - EOF - fail - fi -} - -rename_active_entry() { - # renamed $1 to $2 filepath in active list - sed "s|^$(escape_re $1)$|$2|" $wxdir/active >\ - $wxtmp/active || fail "Error: cannot create $wxtmp/active." - mv -f $wxtmp/active $wxdir/active || \ - fail "Error: mv $wxtmp/active $wxdir/active failed." -} - -is_active() { - # Return 0 if filepath arg is found in active list. - wx_active|grep -q "^$(escape_re $1)$" -} - -# -# ask user if s/he wants to remove an entry from the active list. -# Will not remove entries that differ from parent or are new. -# -ask_remove_active_entry() { - # if an arg is passed in then this is assumed to be the filepath - # otherwise we assume the variables were set properly by the caller - if [[ $# -eq 1 ]]; then - dir=$(dirname $1) - file=$(basename $1) - filepath=$1 - - if [[ ! -f $file ]]; then - echo "Cannot find $file" - return 1 - fi - fi - - if is_active $filepath; then - if wx_pnt_filepath $filepath; then - if ! cmp -s $file $parentfilepath; then - cat <<-EOF - -The file $filepath -differs from parent file: -$parentfilepath -and will remain in the active list. - EOF - return - fi - else - # New file, leave in active list. - cat <<-EOF -$filepath -is new and will remain in active list. Use: -'$ME uncreate $filepath' -to remove from active list. - EOF - return - fi - # Remove entry from active list because it is the same as - # the parent. - echo "There is no difference between $filepath and the parent" - echo "$parentfilepath" - yesno "Okay to remove $filepath from active list?" - if [[ "$answer" == 'yes' ]]; then - remove_active_entry $filepath - fi - fi -} - -refresh_pnt_nt_cache() { - # Refresh the parent nametable cache if necessary. - # Note, this is a cache for the parent nametable entries that - # have the same hash as the local active and renamed files. - - # no parent so nothing to update. - [[ -z $parent ]] && return 0 - - if [[ ! -r $parent/Codemgr_wsdata/nametable ]]; then - fail "Error: cannot read $parent/Codemgr_wsdata/nametable" - fi - - if [[ ! -f $wxtmp/parent_nametable || - $parent/Codemgr_wsdata/nametable -nt $wxtmp/parent_nametable || - $wsdata/parent -nt $wxtmp/parent_nametable || - $wxdir/local_nametable -nt $wxtmp/parent_nametable ]]; then - cut -f2- -d' ' $wxdir/local_nametable > $wxtmp/hash_list - - if [[ ! -f $wxtmp/hash_list ]]; then - fail "Error: cannot create $wxtmp/hash_list." - fi - - if [[ -s $wxtmp/hash_list ]]; then - # Use hash list to get only the parent files - # we're interested in. - fgrep -f $wxtmp/hash_list \ - $parent/Codemgr_wsdata/nametable \ - > $wxtmp/parent_nametable - [[ ! -f $wxtmp/parent_nametable ]] && \ - fail "Error: cannot create $wxtmp/parent_nametable" - else - - # There aren't any files to search for so just - # update the timestamp. - - touch $wxtmp/parent_nametable - fi - fi -} - -# add an active file to the new list -add_new() { - typeset efp=$(escape_re $1) - # update new file list - if [[ ! -f $wxdir/new ]]; then - touch $wxdir/new || fail "Error: cannot create $wxdir/new." - fi - if is_active $1 && ! grep -q "^$efp$" $wxdir/new; then - echo "$1" >> $wxdir/new || fail "Error: cannot update $wxdir/new." - fi -} - -# remove a file from the new list -remove_new() { - # remove entries in new list - typeset efp=$(escape_re $1) - if [[ -f $wxdir/new ]] && grep -q "^$efp$" $wxdir/new; then - grep -v "^$efp$" $wxdir/new > $wxtmp/new - [[ ! -f $wxtmp/new ]] && fail "Error: cannot create $wxtmp/new" - mv -f $wxtmp/new $wxdir/new || fail "Error: cannot create $wxdir/new." - fi -} - -update_active() { - # Try to add an entry to the active list - typeset efp=$(escape_re $1) - - if ! is_active $1; then - if [[ -n "$comment_file" ]]; then - # Use sed to remove any empty lines from comment file. - (echo $1; echo; sed '/^[ ]*$/d' $comment_file;\ - echo) >>$wxdir/active || - fail "Could not update active list." - else - (echo $1; echo; wx_show_comment; echo) \ - >> $wxdir/active || - fail "Could not update active list." - echo "Remember to edit the comment in the active list "\ - "(use '$ME ea')." - fi - add_local_nt_entry $1 - fi # End if not in active list -} - -sort_active() { - typeset origfp=$filepath - - # Note must use filepath for wx_show_comment - wx_active | sort | while read filepath; do - (print "$filepath"; print; wx_show_comment; print) - done > $wxtmp/active_sort || \ - fail "Error: cannot create $wxtmp/active_sort" - mv -f $wxtmp/active_sort $wxdir/active || \ - fail "Error: cannot create $wxdir/active" - - filepath=$origfp -} - -sort_renamed() { - sort $wxdir/renamed > $wxtmp/renamed_sort || \ - fail "Error: cannot create $wxtmp/renamed_sort" - mv -f $wxtmp/renamed_sort $wxdir/renamed || \ - fail "Error: cannot create $wxdir/active" -} - -update_active_comment() { - # replace comment in active list entry with contents of $comment_file - nawk ' - # find active list entry to modify - $1 == filepath { - # print filepath line - while(NF > 0){ - print $1; - getline; - } - #print 1 blank (delimit) - print ""; - # Get past blank lines - while(NF == 0){ - getline; - } - # Get past active entry comments - # append to or replace comment - if (comment_mode == "append"){ - while(NF > 0) { - # output existing comments - print $0; - getline; - } - } else { - # get past existing comments - while(NF > 0) getline; - } - - # output new comments - while (getline < comments){ - # do not print blank lines - if (NF > 0) - print $0 - } - close comments - # print delimiting blank line - printf "\n" - - # Get past ending blank lines in active entry - NF=0 - while(NF == 0) { - if (getline) { - continue; - } else { - next; - } - } - } - # print the other active list entries - { print $0; } ' filepath=$1 comment_mode=$comment_mode \ - comments=$comment_file $wxdir/active >$wxtmp/tmp_active && \ - mv $wxtmp/tmp_active $wxdir/active - if [[ $? -eq 0 ]]; then - echo "$1 comment(s) updated in active list." - else - cat <<-EOF - -An error occured trying to update comments for $1 in the active list. -The active list ($wxdir/active) may be corrupt. You should check it out -and possilbly run '$ME ea' to fix. - - EOF - fail - fi -} - -lookup_parent() { - # Find a local file's parent filepath. - # Returns 1 if not found (local file is new) - # Sets env var. parentfilepath and parenthash if found - # Requires a file arg. - # Updates local and parent nt caches. - - typeset efp parententry localfile hash1 hash2 hash3 hash4 \ - local_nt pnt_nt - - parentfile= - parenthash= - - if [[ -z $parent ]]; then - cat >&2 <<-EOF - -Warning: there is no parent for the current workspace so local file: -$1 -is assumed to be new. - EOF - return 1 - fi - if [[ ! -f $wsdata/nametable ]]; then - # Nothing has been brought over so assuming new file. - cat >&2 <<-EOF - -Warning: the $wsdata/nametable -doesn't exist so -$1 -is assumed to be new. - EOF - return 1 - fi - - if [[ ! -r $parent/Codemgr_wsdata/nametable ]]; then - fail "Error: cannot read $parent/Codemgr_wsdata/nametable." - fi - if [[ ! -f $wxtmp/parent_nametable ]] || $need_pnt_refresh; then - refresh_pnt_nt_cache - need_pnt_refresh=false - fi - if [[ ! -f $wxdir/local_nametable ]]; then - touch $wxdir/local_nametable || - fail "Error: cannot create $wxdir/local_nametable." - fi - - efp=$(escape_re $1) - - for local_nt in $wxdir/local_nametable $wsdata/nametable; do - - # May be multiple entries in nametable, see if one - # matches parent. - - grep "^$efp " $local_nt |\ - while read localfile hash1 hash2 hash3 hash4; do - for pnt_nt in $wxtmp/parent_nametable \ - $parent/Codemgr_wsdata/nametable; do - # get current parent nt entry - parententry=$(grep \ - " $hash1 $hash2 $hash3 $hash4$" $pnt_nt) - if [[ -n "$parententry" ]]; then - # found parent entry - parentfile=$(echo "$parententry" |\ - cut -f1 -d' ') - parenthash="$(echo "$parententry" |\ - cut -f2- -d' ')" - if [[ "$local_nt" == \ - "$wsdata/nametable" ]]; then - - # Update the local nt - # hash cache if parent - # found and local - # workspace nt used. - - add_local_nt_entry $localfile - fi - if [[ $pnt_nt == \ - $parent/Codemgr_wsdata/nametable ]] - then - - # Update the parent nt - # hash cache if actual - # parent nt used. - - echo $parententry >>\ - $wxtmp/parent_nametable - fi - - # break out of all the loops if - # parent found - - break 3 - fi - done # for pnt_nt - done # while read active file - done # for local_nt - - if [[ -z "$parentfile" ]]; then - # parent filepath not found. - return 1 - else - # parent filepath found. - return 0 - fi -} - -# -# Detect if a file was locally renamed -# -renamed() { - # Return 0 if renamed, 1 if not locally renamed - # parentfile and parenthash set as side effect - # Must be used by commands that set filepath (like wx_eval) - - if [[ ! -f $wxdir/renamed ]]; then - update_renamed_dir - fi - - # new is the new filename in the current ws, old is the previous - # filename that should exist in parent ws. - - if grep -q "^$(escape_re $filepath) " $wxdir/renamed; then - if lookup_parent $filepath; then - return 0 - else - - # New files aren't in $wxdir/renamed so no - # parent is a problem - - fail "Error: renamed $filepath but no matching parent"\ - "file in $parent" - fi - else - # not locally renamed - return 1 - fi -} - -wx_pnt_filepath() { - # return 0 if parent file found. Side effect: sets parentfilepath - # and parentsdot. parentfile and parenthash are set via lookup_parent. - - # if an arg is passed in then this is assumed to be the filepath - # otherwise we assume the variables were set properly by the caller - if [[ $# -eq 1 ]]; then - dir=$(dirname $1) - file=$(basename $1) - filepath=$1 - fi - - # Find the parent filename - if lookup_parent $filepath; then - parentfilepath=$parent/$parentfile - parentsdot=$parent/$(dirname $parentfile)/SCCS/s.$(basename \ - $parentfile) - if [[ -f $parentfilepath && -s $parentsdot ]]; then - # found - return 0 - else - fail "Error: located parent filepath $parentfilepath"\ - "but file does not exist or SCCS file is empty." - fi - fi - - # wasn't found - return 1 -} - -get_pb_output() { - # Get output of putback -n (useful for parsing to find diffs between - # workspaces). Creates $wxtmp/putback.err and $wxtmp/putback.out - typeset -i rc=0 - typeset origdir=$(pwd) - # clean up if interrupted. - trap "rm $wxtmp/putback.out;exit 1" HUP INT QUIT TERM - - cat <<-EOF -Doing a '$PUTBACK -n $*' to find diffs between workspaces. -Please be patient as this can take several minutes. - EOF - - cd $workspace - - $PUTBACK -n $* 2>$wxtmp/putback.err >$wxtmp/putback.out - rc=$? - # Note a blocked putback returns a 2 but is not a problem. - if [[ $rc -ne 0 && $rc -ne 2 ]]; then - rm $wxtmp/putback.out - fail "Error, $PUTBACK -n $* failed. See $wxtmp/putback.err"\ - "for details." - fi - trap - HUP INT QUIT TERM - cd $origdir - return 0 -} - -wx_usage() { - version - - cat << EOF - -See for usage tips. - -Usage: $ME command [-D] [args] - - -D turn on debugging for any command (output to stderr) - -===================== Initialization and Update Commands ==================== - $ME init [-f(t|q|n) [-s]] [src-root-dir] - initialize workspace for $ME usage - -f(t|q|n): non-interactive mode of update. Use this - to keep init from asking questions. - -ft: thorough update (update both active and - renamed lists with all diffs between parent - and current workspace). - -fq: quick update (update active list with files - currently checked out in current workspace). - -fn: no update (just create empty active and - renamed lists if they don't exist already). - -s: keep active list sorted by default. Must - follow a -f(t|q|n) flag. - src-root-dir: optional path relative to top of - workspace where wx will search for files. - Use "." to set src-root to top of - workspace. Default is usr. - $ME update [-q|-r] [-s] - Update the active and renamed file lists by - appending names of all files that have been - checked out, changed, created or renamed as - compared to the parent workspace. This is the - most accurate way of updating but it is slow. - All files in the workspace must be under SCCS - control in order for update to find them. Note, - this operation can be sped up in some cases by - setting the PUTBACK env. variable to use - "cm_env -g -o putback". (See - http://webhome.holland.sun.com/casper/ for more - info about the turbo def.dir.flp tool). - - -q: quick update (only updates active list with - files currently checked out in workspace). This - is faster but will not find renames or files that - have been checked-in/delget'ed. - -r: only update the renamed list. Does not update - the active list. - -s: sort the active list. - -======================== Information Commands =========================== - $ME list [-r|-p|-w] list active files (the ones you are working on) - -r: list only renamed active files. - -p: output list of both active and renamed files - suitable for input to putback. - -w: output list of both active and renamed files - suitable for input to webrev (see $ME webrev - subcommand below). - $ME active alias for list - $ME pblist alias for list -p (see above). - - $ME renamed [-a|-d|-p] - list locally renamed files. The output format is: - "new_name previous_name". Note, deleted files are - a special case of rename. - -a: list only renamed active files (same as list -r) - -d: list only deleted files - -p: show "new_name parent_name" (Note, parent_name - may not be the same as previous_name) - $ME new [-t] List new active files (files that exist in child only) - Note, should be run before reedit (see reedit below). - -t: thorough, does not use new cache (slower but more - accurate if new cache isn't current). - $ME out find all checked-out files in workspace - $ME info [file ...] show all info about active files - - $ME diffs [file ...] - show sccs diffs for files (current vs previous - local version). Will show diffs for all active - files if no files given on command line. Will - use WXDIFFCMD environment variable if set. Hint, - try: export WXDIFFCMD="diff -bwU5" - - $ME tdiffs [file ...] - Similar to diffs but new files are also displayed. - New files are those listed by '$ME new'. - - $ME pdiffs [file ...] show diffs against parent files - Will show diffs between local file and it's - parent for all active files if no files given on - command line. Will use WXDIFFCMD environment - variable if set. - - $ME tpdiffs [file ...] show diffs against parent files - Similar to pdiffs but new files are also displayed. - A file is considered new if it does not exist in - the parent. - - $ME prt [-y] show sccs history for all active files - - $ME comments display check-in comments for active files - $ME bugs [-u] display all bugids in check-in comments - $ME arcs [-u] display all ARC cases in check-in comments - $ME pbcom [-v] [-u] [-N] display summarized comments suitable for putback - Default is to display only bugs and arc cases. Will - display warnings about non-bug comments to stderr. - -v: display all comments verbatim including non-bug/arc - -u: prevent sorting, order determined by active list - -N: don't check bug synopsis against bug database - -======================== File Manipulation Commands ====================== - $ME edit [-s] [file ...] - check out either file(s) on command line or - all active files if no file args. - (Updates the active list.) - -s: silent, less sccs diagnostic output. This is - true for the other commands that accept the - -s flag. - $ME checkout Alias for edit command. - $ME co Alias for edit command. - - $ME unedit [-s][-f] [file ...] - Returns file(s) to state prior to edit/checkout - Note, files will be unlocked and any changes made - when file was last checked out will be lost. - Unedit all active files if no files listed on - command line. Removes active list entry if there - are no diffs between local and parent file. - (Updates active list) - -f: force unedit, non-interactive. Will backup - if wx files newer than last backup. - $ME uncheckout Alias for unedit command. - $ME unco Alias for unedit command. - - $ME delget [-(c|C) comment_file][-s][-f] [file ...] - Check in all active files or files on command - line. Check in comments will be those in active - file. See '$ME comments' for more info. - -c comment_file: use comment(s) in specified comment - file when checking in file(s). Note, - each comment should be on new line, - blank lines not allowed. Existing - comments in active list will be - replaced by contents of comment_file. - -C comment_file: Similar to -c but comments are - appended to current active list - comments. - -f: force checkin, no checks, non-interactive. - Use this if your sure the files okay to checkin - otherwise this command will check for - keyword problems. Will backup if wx files - newer than last backup. - - NOTE: use redelget to reset new file's version to 1.1. - - $ME checkin Alias for delget command. - $ME ci Alias for delget command. - - $ME create [-(c|C) comment_file] [-f] [-o] file [file ...] - Creates one or more files in the workspace. - (Updates active list) - -(c|C) comment_file: see delget - -f: force create regardless of warnings, - (non-interactive). - -o: also check out file for further editing. - - $ME uncreate [-f] [file ...] - Undoes the create of a new file. The file's - active list entry, its SCCS history and the - entry in the workspace nametable will be removed - but the file will stay in the workspace. - Will uncreate all new files in active list if - no file argument is specified. - -f: force uncreate, non-interactive. Will backup - if wx files newer than last backup. - - $ME get [-k][-r #][-p] [file ...] - Get a copy of all active files or files on command - line. By default this is a read only version of - the file. - -r #: get specified version # - -p: output to stdout - -k: don't expand the sccs ID string - $ME extract Alias for get command. - - $ME reedit [-m] [-s] [file ...] - Collapse the sccs delta (file history) such that - all changes made to the file in the current - workspace are now in one delta. If no files are - given on command line then all the active files - are processed. The files are left in a checked - out state so you can make further changes if a - resolve to make all your changes look like a - single delta. This eliminates the uninteresting - leaf deltas that arise from resolving conflicts, - so your putbacks do not contain a bunch of noise - about every bringover/resolve you did in the - interim. Accepts the same compression flags as - $ME backup. If [file ...] given, wx only - reedits files passed on command line. This adds - files to active list if not already there. - - NOTE: reedit is appropriate for leaf workspaces - ONLY -- applying reedit to an interior-node - workspace would delete all childrens comments - and confuse Teamware tools in general. - - NOTE: if files are listed as new that are not - then DO NOT use the reedit as it will destroy - the file history. - - NOTE: if a file is new reedit will leave the - file checked out so in order to keep the delta - version at 1.1 redelget must be used for - checkin. - - -m: only reedit files that have more that one - delta as compared to parent file. New files - will be recreated with comment found in - active list. - -s: silent checkin - - $ME recheckout Alias for reedit command. - $ME reco Alias for reedit command. - - $ME redelget [-m][-s] [file ...] - Similar to reedit but the file is checked in - when the command is done. This is the command to - use to collapse new files to their initial - 1.1 delta (will assign comment in active list). - $ME recheckin Alias for redelget command. - $ME reci Alias for redelget command. - - $ME delete [-f] [file ...] - Delete one or more files from the workspace. - Will delete all files in active list if no file - args. Note, for files brought over from parent, - this command actually moves the file under the - deleted_files/ subdir so it can be recovered. - For new files this command can remove the file - and file history completely. - (Updates active list if file is in there.) - -f : force delete regardless of warnings - (non-interactive) - - Warning, this will completely remove new - files from the workspace. Will backup - if wx files newer than last backup. - $ME rm Alias for delete command. - - $ME mv file newfile - Rename file to newfile - (Updates active list with new file name) - $ME mv file newdir - $ME mv dir newdir - Renames dir or file to newdir. If newdir exists - then dir will be subdir under newdir. Note, - this renames all files in dir and can take a - while if there are a lot of files affected by - the rename. (Updates active list) - - $ME reset [-f] [file ...] - Resets file contents and history to that of - parent file. If the file was renamed locally it - will be renamed to that of the parent. It does not - work on new files (see uncreate or delete). - - NOTE: use with care. If something goes wrong, - do a wx restore from the last backup and copy - wx/tmp/nametable.orig to Codemgr_wsdata/nametable. - -======================== Teamware Commands ====================== - $ME putback [-v][-f][-N][Teamware putback flags, see below][file ...] - Use Teamware putback command to putback either - file(s) specified or *all* active and renamed - files if no file(s) specified. Will use pbcom - output as the putback comments. - -f: force non-interactive mode (will not prompt) - -v: pass comments verbatim to putback(see pbcom) - -N: don't check bug synopsis against bug database - Accepts -n, -p pws, -q putback flags ('man putback' - for more info). - $ME pb alias for putback. - - $ME resolve [Teamware resolve args] - resolve bringover conflicts and reedit merged - files. See 'man resolve' for args. - -======================== ON Rules checking Commands ====================== - $ME cstyle run cstyle over all active .c and .h files - skips files in wx/cstyle.NOT - $ME jstyle run jstyle over all active .java files - skips files in wx/jstyle.NOT - $ME hdrchk run 'hdrchk -a' over all active .h files - skips files in wx/hdrchk.NOT - $ME makestyle run makestyle over all active Makefiles - $ME keywords run keywords over all active files - skips files in wx/keywords.NOT - $ME copyright make sure there is a correct copyright message - that contains the current year - skips files in wx/copyright.NOT - $ME cddlchk make sure there is a current CDDL block in - active files - skips files in wx/cddlchk.NOT - $ME rmdelchk make sure sccs rmdel was not run on active files - (This causes Teamware problems.) - $ME deltachk make sure only 1 sccs delta in active files - (more than 1 breaks gate putback rules unless > 1 - bug in putback.) - $ME comchk make sure comments are okay - $ME rtichk make sure RTI is approved for bugs/rfe's listed - in active list comments. Will skip rtichk if - wx/rtichk.NOT exists. - $ME outchk warn if there are files checked out that aren't in - active list. - $ME nits [file ...] - nits checking. Run cstyle, jstyle, hdrchk, copyright, - cddlchk, and keywords over files to which they are - applicable (makestyle is not currently run - because it seems to be quite broken -- more - noise than data). This is a subset of pbchk checks - suitable for checking files during development. - Use pbchk before doing the final putback. - Will run checks on all active files if no file args. - Will skip checks for files listed in wx/nits.NOT. - $ME pbchk [file ...] - putback check. Run cstyle, jstyle, hdrchk, copyright, - cddlchk, keywords, rmdelchk, deltachk, comchk, rtichk - and outchk over files to which they are - applicable (makestyle is not currently run - because it seems to be quite broken -- more - noise than data). Good command to run before - doing a putback. - Will run checks on all active files if no file args. - Will skip checks for files listed in wx/pbchk.NOT. - -======================== Code Review Commands ====================== - $ME webrev [webrev-args] - generate webrev for active and renamed/deleted files. - Note, uses comments in the active list. This is the - preferred way of reviewing code. Arguments to webrev - may also be specified. - Will skip files listed in wx/webrev.NOT - - $ME codereview [-N] [codereview options] - generate environmentally friendly codereview diffs - for all active files. -N indicates that delta - comments should not be included. - - $ME fullreview [-N] [codereview options] - generate full codereview diffs for all active files. - -N indicates that delta comments should not be - included. - -======================== Backup and Restore Commands ====================== - $ME backup [-i|-n|-z|-b|-t] - make backup copies of all active and renamed files. - -i: info about backups (backup dir and contents) - -n: no compression - -z: use gzip, faster than bzip2 but less compression. - -b: use bzip2, slower but better compression. - -t: backup if wx files are newer than last backup. - Defaults to the compression of the previous backup. - $ME bu Alias for backup command. - - $ME restore [-f] [backup_dir] - restore a backup in a workspace (restores both - active files and performs file renames). A path - to the directory containing the backup to - restore from can be optionally specified. - -f: non-interactive. Will restore from last backup. - -======================== Misc Commands ============================ - $ME apply apply cmd to all active files; for example, - "$ME apply cat" cats every file - $ME eval like apply, but more general. In fact, - "$ME apply cmd" is implemented internally as - "$ME eval 'cmd \$file'". When using eval, - you can refer to \$dir, \$file, \$filepath, - \$parent, and \$workspace. For example: - $ME eval 'echo \$dir; sccs prt \$file | more' - will show the sccs history for each active file, - preceded by its directory. - $ME grep search all active files for pattern; equivalent to - "$ME eval 'echo \$filepath; grep pattern \$file'" - $ME egrep see $ME grep - $ME sed see $ME grep - $ME nawk see $ME grep - - $ME dir echo the $ME directory path (\$workspace/$ME) - $ME e edit the named $ME control file, e.g. "$ME e active". - The editor is \$EDITOR if set, else vi. - - $ME ea shorthand for "$ME e active" (edit active list). - Note, the format for each entry in the active - list is: - - filepath - # no spaces allowed - one or more comment lines # no blank lines between. - # no spaces allowed, ends the entry. - - In general, it is best to only edit the active - list to update comments. Use the other $ME - commands like edit or create to update the - active list when possible. - - $ME ws cat the named workspace control file, i.e. - \$workspace/Codemgr_wsdata/file - $ME args shorthand for "$ME ws args" - $ME access shorthand for "$ME ws access_control" - - $ME help print this usage message - $ME version print current version of this program -EOF - exit 1 -} - -list_putback() { - (wx_active; list_renamed -n)|nawk '!seen[$0]++' -} - -list_new() { - # list new files (not found in parent ws) - typeset new - - if [[ $1 == '-t' ]]; then - wx_active| - while read new; do - # thorough, skip new cache - if ! lookup_parent $new; then - # no parent, new file - echo "$new" - fi - done - else - while read new; do - # use new cache - if ! lookup_parent $new; then - # no parent, new file - echo "$new" - fi - done < $wxdir/new - fi -} - -list_renamed() { - typeset active current old - - if [[ $# -eq 0 ]]; then - cat $wxdir/renamed - elif [[ $1 == '-d' ]]; then - # Only list only deleted file renames - grep '^deleted_files/' $wxdir/renamed - elif [[ $1 == '-n' ]]; then - # Only list only current filenames - cut -f1 -d' ' $wxdir/renamed - elif [[ $1 == '-p' ]]; then - # list parent for current instead of local previous name - while read current old; do - if lookup_parent $current; then - print "$current $parentfile" - else - ring_bell - print -u2 "Warning: cannot find parent file"\ - "for $current" - fi - done < $wxdir/renamed - elif [[ $1 == '-a' ]]; then - # Just list active renamed files - for active in $(wx_active); do - grep "^$(escape_re $active) " $wxdir/renamed - done - elif [[ $1 == '-r' ]]; then - wx_active > $wxtmp/alist || fail "Error: cannot create $wxtmp/alist" - # Just list non-active renamed files (just current name) - while read current old; do - grep -q "^$(escape_re $current)$" $wxtmp/alist || - echo $current - done < $wxdir/renamed - rm -f $wxtmp/alist - else - fail "Invalid flag $i. Run 'wx help' for info." - fi -} - -list_webrev() { - # Output a list of active and renamed files suitable for webrev - for filepath in $( (wx_active; list_renamed -n)|nawk '!seen[$0]++'); do - if renamed; then - echo "$filepath $parentfile" - else - echo "$filepath" - fi - done -} - -wx_webrev() { - typeset origdir=$PWD - - cd $workspace - # skip files listed in .NOT files - cat -s $wxdir/$command.NOT >$wxtmp/NOT - - ( # do the loops in a subshell so there is only one file open - for filepath in $(wx_active); do - if grep -q "^$(escape_re $filepath)$" $wxtmp/NOT; then - print -u2 "$filepath (skipping)" - continue - fi - if renamed; then - echo "$filepath $parentfile" - else - echo "$filepath" - fi - echo "\n$(wx_show_comment)\n" - done - - # Do non-active renamed files - for filepath in $(list_renamed -r); do - if grep -q "^$(escape_re $filepath)$" $wxtmp/NOT; then - print -u2 "renamed $filepath (skipping)" - continue - fi - lookup_parent $filepath || - fail "Error: cannot find parent for $filepath." - if [[ $filepath != $parentfile ]]; then - echo "$filepath $parentfile" - # output empty line, comment, empty line - echo "\nRenamed only (webrev comment generated by "\ - "$ME, not an sccs comment)\n" - else - echo "$filepath" - echo "\nWarning, file in renamed list but has same "\ - "name as parent (not an sccs comment)\n" - fi - done - # End of subshell - ) > $wxtmp/webrev.list - - # Note that the file list must come last. - ${WXWEBREV:-webrev} -w "$@" $wxtmp/webrev.list - - cd $origdir -} - -# -# list all active files -# -wx_active() { - # do not print hash by default - typeset rc hash=0 - - case $1 in - # list only renamed active files - -r) list_renamed -a; return 0;; - # list suitable for putback (both active and renamed) - -p) list_putback; return 0;; - # list suitable for webrev (both active and renamed) - -w) list_webrev; return 0;; - -*) fail "Invalid flag $1. See 'wx help' for more info.";; - esac - - if [[ ! -r $wxdir/active ]]; then - fail "Error: cannot read $wxdir/active" - fi - - nawk ' - { - # skip blank lines - while (NF == 0) { - if (getline == 0) - next; - } - if (NF > 0){ - # print the active filepath - print $1; - getline; - } - # skip blank lines - while (NF == 0) { - if (getline == 0){ - # Error, corrupt active list (missing comment) - exit 1 - } - } - # skip comment - while (NF > 0) { - if (getline == 0){ - # Error, blank line after comment missing - exit 2 - } - } - }' $wxdir/active - - rc=$? - if [[ $rc -eq 1 ]];then - fail "Corrupt active list (missing comment)." - elif [[ $rc -eq 2 ]];then - fail "Corrupt active list (blank line needed after comment)." - fi -} - -# -# show the comment for $filepath -# -wx_show_comment() { - if [[ -f $wxdir/active ]]; then - nawk ' - { - filename=$1 - getline - while (getline) { - if (length == 0) - next - if (filename == target) { - if ($0 == "NO_COMMENT") { - found = 0 - exit 1 - } - found = 1 - print - } - } - } - END { - if (found == 0) - print "NO_COMMENT" - exit 1 - found - }' target=$filepath $wxdir/active - return $? - else - echo "NO_COMMENT" - fi -} - -bugdb_lookup_monaco() { - typeset buglist=$1 - typeset monaco=/net/monaco.sfbay/export/bin/monaco - - if [[ ! -x $monaco ]]; then - return 1 - fi - - $monaco -text <<-EOF - set What = - substr(cr.cr_number, 1, 7), synopsis - - set Which = - cr.cr_number in ($buglist) - - set FinalClauses = - order by cr.cr_number - - do query/CR - EOF -} - -bugdb_compare() { - nawk -v bugdb=$1 -v active=$2 -f - <<-"EOF" - BEGIN { - file = bugdb - while (getline < file) { - synbugdb[$1] = substr($0, length($1) + 1) - } - - file = active - while (getline < file) { - synactive = substr($0, length($1) + 1) - # If the synopsis doesn't match the bug database - # and the synopsis isn't what's in the database - # with " (something)" appended, spew a warning. - if (!($1 in synbugdb)) { - print "Bug " $1 " is not in the database" - } else if (synbugdb[$1] != synactive && - !(index(synactive, synbugdb[$1]) == 1 && - substr(synactive, length(synbugdb[$1])) ~ \ - / \([^)]*\)$/)) { - print "Synopsis of " $1 " is wrong:" - print " should be:" synbugdb[$1] - print " is:" synactive - } - } - } - EOF -} - -# -# Summarize all comments listing, in order: -# - free-form comments -# - ARC case comments -# - Bug comments -# -# -a will suppress ARC case comments -# -b will suppress bug comments -# -n will do pbchk processing (give all warnings, no error exit) -# -o will suppress free-form (other) comments -# -p will do pbcom checking and exit if it finds problems unless -v is given -# -u will prevent sorting of the ARC case comments and bug comments -# -v will output all comments verbatim (no sorting) -# -N will prevent bug lookup, which may take a while. -# -# Note, be careful when modifying this function as sometimes the output -# should go to stdout, as in the case of being called via pbchk and -# sometimes the output should go to stderr. Think about this when -# making changes in here. -# - -function wx_summary { - typeset i comment arc arcerr bug bugnospc bugid buglist synopsis \ - show_arcs=true \ - show_bugs=true \ - show_others=true \ - verbatim=false \ - pbchk=false \ - pbcom=false \ - cmd=sort \ - nolookup=false - - while getopts :abnopuvN i; do - case $i in - a) show_arcs=false;; - b) show_bugs=false;; - n) pbchk=true;; - o) show_others=false;; - p) pbcom=true;; - v) verbatim=true;; - u) cmd=cat;; - N) nolookup=true;; - *) fail "Invalid flag -$OPTARG. See 'wx help' for more"\ - "info.";; - esac - done - - # Store all the comments in a tmp file - for filepath in $file_list; do - wx_show_comment - done | nawk '!seen[$0]++' > $wxtmp/comments - - if grep -q "^NO_COMMENT$" $wxtmp/comments; then - print -u2 "Warning, found NO_COMMENT. Run '$ME ea' to edit the "\ - "comments." - if $pbcom; then - # Don't want to output anything to stdout for a pbcom - # if there is an error. - return 1 - fi - fi - if $pbcom && $verbatim; then - # All comments output verbatim. Note, is hacky because - # of the wx_summary interface. pbcom calls wx_summary - # with -po assuming other comments shouldn't be output. - show_others=true - fi - - # Note, hard tab in the arc regex. This only recognizes FWARC, - # LSARC and PSARC. Also, regex must be compat with both egrep - # and nawk. - arc='(FW|LS|PS)ARC[\/ ][12][0-9][0-9][0-9]\/[0-9][0-9][0-9][^0-9]' - # bug ID must followed by single space - bug='[0-9][0-9][0-9][0-9][0-9][0-9][0-9] ' - bugnospc='[0-9][0-9][0-9][0-9][0-9][0-9][0-9][^ ]' - - if $show_arcs; then - # Note must use /usr/bin/sort. - if ! egrep "^$arc" $wxtmp/comments | - sed 's#\([A-Z][A-Z]*ARC\)[/ ]#\1 #' | sort | - /usr/bin/sort -cu -k 1,2 2>$wxtmp/error >/dev/null - then - arcerr=$(nawk '{match($0, '"/$arc/"'); \ - print substr($0, RSTART, RLENGTH);}' \ - $wxtmp/error) - - if $pbchk; then - # if pbchk print to stdout - print "Inconsistent ARC summaries for: $arcerr" - else - # else print to stderr - print -u2 \ - "Inconsistent ARC summaries for: $arcerr" - fi - if $pbcom && ! $verbatim; then - - # Don't want to output anything to - # stdout for a pbcom if there is an - # error. - - return 1 - fi - fi - fi - - if $show_bugs; then - # Treating bug comments with "(nit comment)" at the end as the - # same as the original bug hence the sed and nawk below - # Note hard tabs in sed arg. - # Must use /usr/bin/sort. - if ! grep "^$bug" $wxtmp/comments |sort| - sed 's/[ ][ ]*([^)]*) *$//' | - nawk '!seen[$0]++'| - /usr/bin/sort -cnu 2>$wxtmp/error >/dev/null; then - if $pbchk; then - print -n "Inconsistent bug summaries for: " - sed 's#^[^0-9]*\('"${bug}"'\).*#\1#' \ - $wxtmp/error - else - print -nu2 "Inconsistent bug summaries for: " - sed 's#^[^0-9]*\('"${bug}"'\).*#\1#' \ - $wxtmp/error >&2 - fi - if $pbcom && ! $verbatim; then - # Don't want to output anything to - # stdout for a pbcom if there is an - # error. - return 1 - fi - fi - - # Compare bug synopsis in active comments with the bug database. - # If we've been passed -N, then we just never set buglist, thus - # skipping the lookup. - if ! $nolookup; then - grep "^$bug" $wxtmp/comments | sort > $wxtmp/buglist.active - cat $wxtmp/buglist.active | while read bugid synopsis; do - buglist=$buglist,$bugid - done - buglist=${buglist#,} - else - if $pbchk; then - print "Not performing bug synopsis check (be careful)" - else - print -u2 "Not performing bug synopsis check (be careful)" - fi - fi - if [[ -n $buglist ]]; then - bugdb_lookup_monaco $buglist > $wxtmp/buglist.bugdb - if [[ -s $wxtmp/buglist.bugdb && $? -eq 0 ]]; then - bugdb_compare $wxtmp/buglist.bugdb \ - $wxtmp/buglist.active > $wxtmp/error - if [[ -s $wxtmp/error ]]; then - if $pbchk; then - cat $wxtmp/error - else - cat $wxtmp/error >&2 - fi - if $pbcom && ! $verbatim; then - # Don't want to output anything - # to stdout for a pbcom if there - # is an error. - return 1 - fi - fi - else - if $pbchk; then - print "Could not perform bug synopsis check" - else - print -u2 "Could not perform bug synopsis check" - if $pbcom; then - print -u2 "Use -N to skip bug synopsis check (be careful)" - fi - fi - if $pbcom && ! $verbatim; then - # Don't want to output anything - # to stdout for a pbcom if there - # is an error. - return 1 - fi - fi - fi - - if egrep "^$bugnospc" $wxtmp/comments >$wxtmp/error; then - # must have single space following bug ID - if $pbchk; then - print "\nThese bugs are missing single space following the bug ID" - print "(output prefaced by active file line number ':'):" - while read comment - do - grep -n "^$comment" $wxdir/active - done < $wxtmp/error - else - print -u2 "\nThese bugs are missing single space following the bug ID" - print -u2 "(output prefaced by active file line number ':'):" - while read comment - do - grep -n "^$comment" $wxdir/active >&2 - done < $wxtmp/error - fi - if $pbcom && ! $verbatim; then - # Don't want to output anything to - # stdout for a pbcom if there is an - # error. - return 1 - fi - fi - fi - - # Create warning for pbchk or pbcom. - if $pbchk || ($pbcom && ! $verbatim) && - egrep -v "^($bug|$bugnospc|$arc|NO_COMMENT$)" $wxtmp/comments\ - > $wxtmp/other_comments; then - cat <<-EOF -Warning, the following comments are found in your active list -that are neither bug or arc cases: - - EOF - cat $wxtmp/other_comments - print -- "\n---- End of active list comment warnings ----" - fi > $wxtmp/comment_warning - - if [[ -s $wxtmp/comment_warning ]]; then - if $pbchk; then - # output to stdout, don't exist in case there are more - # warnings. - cat $wxtmp/comment_warning - elif $pbcom && ! $verbatim ; then - # Don't want to output anything to stdout for a pbcom - # if there is an error. - cat $wxtmp/comment_warning >&2 - return 1 - fi - fi - - if $pbchk; then - cd $workspace - # See if sccs delta comment is the same as active list comment - for filepath in $file_list; do - # extract most recent delta comment - sccs prs -d ':C:' $filepath | sort > $wxtmp/com1 || - fail "sccs prs -d ':C:' $filepath failed." - - # Add blank line to active comments so following cmp will - # work properly. - (wx_show_comment; print) | sort > $wxtmp/com2 - - if ! cmp -s $wxtmp/com1 $wxtmp/com2; then - print "\n$filepath" - print "Warning: current sccs comment does not"\ - "match active list comment" - print "(< sccs comment, > active list comment):" - diff $wxtmp/com1 $wxtmp/com2 - fi - done - # Just output warnings for pbchk - return 0 - fi - - if $show_others; then - if ! $verbatim; then - # The non-verbatim check should have produced the - # other_comments file. - cat $wxtmp/other_comments| $cmd - else - # just output comments verbatim then return - cat $wxtmp/comments - return 0 - fi - fi - - if $show_arcs; then - egrep "^$arc" $wxtmp/comments | $cmd - fi - - if $show_bugs; then - egrep "^$bug" $wxtmp/comments | $cmd - fi - return 0 -} - -update_renamed_file() { - # Try to add a entry to the renamed list. Note, this stores the new - # name and previous name, not the parent name as this is more useful in - # detecting cyclic renames. - - # ofp: old filepath, nfp: new filepath - typeset ofp=$1 nfp=$2 - - # remove old and new entries from renamed - egrep -v "^($(escape_re $ofp)|$(escape_re $nfp)) " $wxdir/renamed \ - >$wxtmp/renamed - [[ ! -f $wxtmp/renamed ]] && fail "Error: cannot create $wxtmp/renamed" - mv -f $wxtmp/renamed $wxdir/renamed || \ - fail "Error: cannot create $wxdir/renamed." - - # remove old entries from local nt cache - remove_local_nt_entry $ofp - - # Do not update renamed list if the filepath is the same as - # the parent or the file is new. - if lookup_parent $nfp; then - if [[ $parentfile != $nfp ]]; then - print "$nfp $ofp" >> $wxdir/renamed || \ - fail "Error: cannot append $wxdir/renamed." - - [[ $ACTSORT == sort ]] && do_renamed_sort=true - fi - fi - return 0 -} - -update_renamed_dir() { - typeset append pb_files new orig - typeset -i rc - - if [[ $# -eq 0 ]]; then - # No args so we need to create the renamed list from - # the source root. - append=false - if [ -r $wxdir/srcroot_dir ]; then - pb_files=$(cat $wxdir/srcroot_dir) - else - pb_files=$DEFAULT_SRCDIR - fi - else - # Assuming one or more filepaths as args - append=true - pb_files="$*" - fi - echo "Updating $ME renamed list... this may take several minutes." - - # Get output of putback -n to detect renames elsewhere in - # this script. - - get_pb_output $pb_files - - nawk ' - /^rename from:/{orig_file=$3} - $1 == "to:" {print $2 " " orig_file}' \ - $wxtmp/putback.out >$wxtmp/pb_renames || \ - fail "Error, creation of $wxtmp/pb_renames failed." - - cp $wxdir/renamed $wxdir/renamed.old || - fail "Error: cannot create $wxdir/renamed.old." - - if $append; then - nawk '!seen[$0]++' $wxtmp/pb_renames $wxdir/renamed \ - > $wxtmp/renamed || \ - fail "Error: cannot create $wxtmp/renamed." - mv -f $wxtmp/renamed $wxdir/renamed || \ - fail "Error: cannot create $wxdir/renamed." - else - mv -f $wxtmp/pb_renames $wxdir/renamed || - fail "Error: cannot create $wxdir/renamed." - fi - - [[ $ACTSORT == sort ]] && do_renamed_sort=true -} - -# returns 0 if a pattern in patternfile matches input path arg -pathcheck() { - typeset pattern path=$1 patternfile=$2 - - while read pattern; do - if [[ $path == $pattern ]]; then - return 0 # pattern matched path - fi - done < $patternfile - return 1 # file path not matched by pattern -} - -# -# Evaluate a command for all listed files. This is the basic building -# block for most wx functionality. -# - -wx_eval() { - typeset -i changedir=1 - - if [[ $# -gt 1 && "$1" == "-r" ]]; then - changedir=0 - shift - fi - - pre_eval=$* - # skip files listed in .NOT files - cat -s $wxdir/$command.NOT >$wxtmp/NOT - for filepath in $file_list; do - if pathcheck $filepath $wxtmp/NOT; then - print "$filepath (skipping)" - else - cd $workspace - dir=`dirname $filepath` - file=`basename $filepath` - [[ $changedir -eq 1 ]] && cd $dir - eval $pre_eval - fi - done -} - -# -# Initialize a workspace for wx. -# - -wx_init() { - typeset srcroot_dir force=false - - # check that srcroot is relative to top of workspace - if cd $workspace/$1; then - # normalize the srcroot dir for test below - srcroot_dir=$(/bin/pwd) - srcroot_dir="${srcroot_dir#$workspace/}" - if [[ $srcroot_dir == $workspace ]]; then - # Special case need to set srcroot_dir to - # a relative path but we're at the top of the - # workspace. - srcroot_dir="." - fi - else - fail "Source root '$1' does not exist in workspace"\ - "($workspace)." - fi - - if [ -d $wxtmp ]; then - if [[ $2 != -f[nqt] ]]; then - echo "This workspace has already been initialized." - ok_to_proceed 'Do you really want to re-initialize?' - fi - else - mkdir -p $wxtmp - fi - - # - # Make sure to save $srcroot_dir as a path relative to the workspace - # root; an absolute path would break if the workspace name changed. - # - rm -f $wxdir/srcroot_dir - echo $srcroot_dir >$wxdir/srcroot_dir - - backup_dir=$HOME/$ME.backup/$workspace_basename - [[ -d $backup_dir ]] || mkdir -p $backup_dir || - fail "mkdir -p $backup_dir failed." - cd $backup_dir - rm -f $wxdir/backup_dir - pwd >$wxdir/backup_dir || fail "Creation of $wxdir/backup_dir failed." - - touch $wxdir/renamed - touch $wxdir/active - touch $wxdir/new - touch $wxdir/local_nametable - - if [[ -z "$2" ]]; then - # Interactive mode - cat << EOF - Pick one of the following update methods: - - 1) Thorough: Detect any differences between the current workspace - and its parent and update the active, new and renamed lists. Use - this in workspaces where files have been renamed or deleted or - there are files that are different from the parent that are not - checked out. Note, files must be under SCCS control in order for - this method to compare them to the parent workspace. - - 2) Quick: Only update the active list with files that are currently - checked out. Will not update the renamed list. - - 3) None: Use this on workspaces where there are no changes between - the workspace and its parent. This is very quick but will not - update the active, new or renamed lists. - -EOF - read answer?"Which update method? [1|2|3]: " - case $answer in - 1) wx_update;; - 2) wx_update -q;; - 3) ;; - *) fail "Bad answer: ${answer}. Rerun init command"\ - "again";; - esac - yesno "Keep active list sorted by default?" - if [[ "$answer" == 'yes' ]]; then - print "true" > $wxdir/sort_active - else - print "false" > $wxdir/sort_active - fi - else - # non-interactive mode - case $2 in - # forced thorough update - -ft) wx_update; force=true;; - # forced quick update - -fq) wx_update -q; force=true;; - # forced no update - -fn) force=true;; - # invalid arg - -*) fail "$ME $command: unrecognized argument";; - esac - if [[ $3 == -s ]]; then - print "true" > $wxdir/sort_active - else - print "false" > $wxdir/sort_active - fi - fi - print - - if [ -s $wxdir/active ]; then - basedir=$workspace - file_list=`wx_active` - if $force; then - # only backup if necessary - print "Will backup wx and active files if necessary" - wx_backup -t - else - print "Making backup copies of all wx and active files" - wx_backup - fi - else - echo "Active list empty, not doing backup." - echo - fi - - echo "$ME initialization complete" -} - -# -# Find all checked out files -# - -wx_checked_out() { - typeset origdir=$(pwd) - cd $workspace - x=$(ls -t $wsdata/nametable $wxdir/sccs_dirs 2>/dev/null) - if [[ -z $x || "`basename $x`" == nametable ]]; then - if [ -f $wxdir/srcroot_dir ]; then - srcroot_dir=`cat $wxdir/srcroot_dir` - else - srcroot_dir=$DEFAULT_SRCDIR - fi - print -u2 "Workspace nametable changed: sccs_dirs out of date" - print -u2 "Updating $wxdir/sccs_dirs...this may take a few minutes.\n" - rm -f $wxdir/sccs_dirs - find $srcroot_dir -name SCCS -print | sort >$wxdir/sccs_dirs - fi - cd $workspace - rm -f $wxtmp/checked_out - # Note if srcroot_dir = . this must be removed from the front of the - # filepaths. - echo $(sed -e 's,$,/p.*,' $wxdir/sccs_dirs) | \ - tr \\040 \\012 | \ - grep -v '*' | \ - sed -e 's,SCCS/p.,,' |sed -e 's,^\./,,' >$wxtmp/checked_out - cd $origdir -} - -deal_ws_renames() { - # See if any active/renamed files were renamed externally - # (perhaps by bringover?) and try to rename the active entry - # filepath. - typeset fp newfp renamed localfile hash1 hash2 hash3 hash4 \ - notrenamed_list origdir=$(pwd) - cd $workspace - list_putback |\ - while read fp; do - if [[ ! -f $fp ]]; then - # file not found, suspect rename. - # using renamed for error checking. - renamed=false - # search cached local nt to find old hash info - grep "^$(escape_re $fp) " $wxdir/local_nametable |\ - while read localfile hash1 hash2 hash3 hash4; do - # find new filepath - newfp=$(fgrep " $hash1 $hash2 $hash3 $hash4"\ - $wsdata/nametable|cut -f1 -d' ') - - [[ -z $newfp ]] && continue - - if [[ $newfp != $fp ]]; then - update_renamed_file $fp $newfp - rename_active_entry $fp $newfp - echo "\nRenamed active file"\ - "$fp to $newfp" - renamed=true - break - fi - done - if ! $renamed; then - if [[ -z $notrenamed_list ]]; then - notrenamed_list="$fp" - else - notrenamed_list="$notrenamed_list\n$fp" - fi - fi - fi - done - if [[ -n $notrenamed_list ]]; then - ring_bell - cat <<-EOF -Warning, active file(s): - $(echo $notrenamed_list) -not found and cannot be renamed. Use "$ME ea" to edit the active list to -remove these entries if they do not exist in this workspace. - EOF - fi - cd $origdir -} - -# -# Old style update the active file list (by appending all checked out files). -# This is what the original wx update did. -# -wx_update_quick() { - - # Sort active if requested. - [[ "$1" == "-s" ]] && ACTSORT=sort - - wx_checked_out - cd $wxdir - rm -f tmp/files.old tmp/files.new active.new - wx_active >tmp/files.old || fail "Error: cannot create $wxtmp/files.old" - # sed has a hard tab, used to delete lines containing only whitespace - sed '/^[ ]*$/d' tmp/files.old tmp/checked_out| - nawk '!seen[$0]++' | $ACTSORT > tmp/files.new || - fail "Error: cannot create $wxtmp/files.new" - cp -f new new.old || fail "Error: cannot create new.old." - while read filepath ; do - add_local_nt_entry $filepath - (echo "$filepath"; echo; wx_show_comment; echo) - done < tmp/files.new > active.new || - fail "Error: cannot create $wxdir/active.new" - - mv -f active active.old - mv -f active.new active - - echo - echo "New active file list:" - echo - cat tmp/files.new - echo - echo "Diffs from previous active file list:" - echo - ${WXDIFFCMD:-diff} tmp/files.old tmp/files.new - echo "End active diffs ==========================" - - # Do new file processing after active list is updated. - - # Note, the parent nt read check below is hackish because we are - # assuming that lookup_parent needs to read the parent nt and if it - # can't then we want to just issue the warning. - if [[ -n $parent && ! -r $parent/Codemgr_wsdata/nametable ]]; then - echo "\nWarning: cannot read parent nametable, new file list"\ - "not output." >&2 - else - while read filepath; do - # lookup_parent populates local nt cache - if lookup_parent $filepath; then - remove_new $filepath - else - add_new $filepath - fi - done < tmp/files.new - - echo - echo "New new-file list:" - echo - cat new - echo - echo "Diffs from previous new-file list:" - echo - ${WXDIFFCMD:-diff} new.old new - echo "End new diffs ==========================" - fi -} - -# -# Update various lists (active, renamed, new) -# - -wx_update() { - typeset i efp sortarg do_quick=false - typeset -i rc found - # default, update all lists - typeset update_active=true update_renamed=true update_new=true - - while getopts :qrs i; do - case $i in - q) do_quick=true;; - r) update_active=false - update_new=false;; - s) ACTSORT=sort; sortarg="-s";; - *) fail "Invalid flag -$OPTARG. See 'wx help' for more"\ - "info.";; - esac - done - - deal_ws_renames - - if $do_quick; then - # Do old school wx update (only for checked out files) - # This is faster but not as thorough. - wx_update_quick $sortarg - return - fi - - if [[ -z $parent ]]; then - fail "Error: cannot do thorough update, no parent. Use 'update -q'"\ - "instead." - fi - if [[ ! -r $parent/Codemgr_wsdata/nametable ]]; then - fail "Error: cannot read $parent/Codemgr_wsdata/nametable" - fi - - # create tmp/checked_out file which putback -n may not list. - # Do this before putback so it doesn't unnecessarily update the - # sccs dirs cache. - wx_checked_out - - # Get output of putback -n to detect renames and active files. - if [ -f $wxdir/srcroot_dir ]; then - get_pb_output $(cat $wxdir/srcroot_dir) - else - get_pb_output $DEFAULT_SRCDIR - fi - - cd $wxdir - - if $update_renamed; then - if [[ -f renamed ]]; then - mv renamed renamed.old || - fail "Error: cannot create $wxdir/renamed.old." - else - touch renamed.old || - fail "Error: cannot create $wxdir/renamed.old." - fi - - nawk ' /^rename from:/{orig_file=$3} - $1 == "to:" {print $2 " " orig_file}' \ - tmp/putback.out |$ACTSORT > tmp/renamed ||\ - fail "Error, creation of $wxdir/tmp/renamed failed." - mv -f tmp/renamed renamed || \ - fail "Error: cannot create $wxdir/renamed" - - for filepath in $(cut -f1 -d' ' renamed); do - add_local_nt_entry $filepath - done - - echo "New renamed file list:" - echo - cat renamed - echo - echo "Diffs from previous renamed file list:" - echo - ${WXDIFFCMD:-diff} renamed.old renamed - echo "End renamed diffs ==========================" - fi - - if $update_active; then - # Create active list from putback output. - nawk '/^(update|create): / {print $2}; - /^The following files are currently checked out/ \ - {p=1; continue}; - /^"/ {continue}; - NF == 0 {p=0; continue}; - {if (p==1) - print $1}' tmp/putback.out | - sort -u > tmp/active_nawk_out || - fail "Error: cannot create $wxtmp/active_nawk_out" - - # list files in conflict also - nawk '/^(conflict): / {print $2}' tmp/putback.out | - sort -u > tmp/conflict_nawk_out || - fail "Error: cannot create $wxtmp/conflict_nawk_out" - - # Need to read $wsdata/nametable if there are conflicts - if [[ -s tmp/conflict_nawk_out && ! -r $wsdata/nametable ]] - then - fail "Error: cannot read $wsdata/nametable." - fi - - # clear the tmp active file - print -n > tmp/active.new || fail "Error: cannot create tmp/active.new." - - # store current active list - wx_active > tmp/files.old || - fail "Error: cannot create $wxtmp/files.old" - - # go through all the possible active files (keeping the existing - # ones as well). Note hard tab in sed arg. - for filepath in $(sed '/^[ ]*$/d' tmp/files.old \ - tmp/checked_out tmp/conflict_nawk_out \ - tmp/active_nawk_out | nawk '!seen[$0]++' | $ACTSORT); do - - efp=$(escape_re $filepath) - - if grep -q "^$efp$" tmp/conflict_nawk_out; then - - # conflict files have a parent but the - # putback output only shows the parent's - # filename, need to find local name in - # case of rename - - grep "^$efp " $parent/Codemgr_wsdata/nametable|\ - read localfile hash1 hash2 hash3 hash4 - local_file="$(\ - fgrep " $hash1 $hash2 $hash3 $hash4" \ - $wsdata/nametable | cut -f1 -d' ')" - - # continue if empty string - [[ -z "$local_file" ]] && continue - - if ! grep -q "^$local_file" tmp/active.new; then - filepath=$local_file - else - continue - fi - fi - add_local_nt_entry $filepath - (echo $filepath; echo; wx_show_comment; echo)\ - >> tmp/active.new - done - - rm -f tmp/active_nawk_out - - mv -f active active.old - mv -f tmp/active.new active - wx_active > tmp/files.new - - echo - echo "New active file list:" - echo - cat tmp/files.new - echo - echo "Diffs from previous active file list:" - echo - ${WXDIFFCMD:-diff} tmp/files.old tmp/files.new - echo "End active diffs ==========================" - rm -f tmp/files.old tmp/files.new - - fi - - # The new list is for caching names of new files to speed up commands - # that list the new files. - if $update_new; then - if [ -f new ]; then - cp -f new new.old || fail "Error: cannot create file new.old." - elif [ ! -f new.old ]; then - touch new.old || fail "Error: cannot create file new.old." - fi - # Create new list from putback output. - nawk '/^create: / {print $2};' tmp/putback.out | - sort -u > tmp/new || fail "Error: cannot create $wxtmp/new." - mv -f tmp/new new - echo - echo "New new-file list:" - echo - cat new - echo - echo "Diffs from previous new-file list:" - echo - ${WXDIFFCMD:-diff} new.old new - echo "End new diffs ==========================" - fi -} - -wx_edit() { - # Must be called via wx_eval - if [ -f SCCS/p.$file ]; then - echo "$filepath already checked out" - update_active $filepath - elif [ -f $file ]; then - echo $filepath - if sccs edit $silent $file; then - update_active $filepath - else - fail "sccs edit $filepath failed." - fi - else - ring_bell - echo "Warning. file $filepath not found." - fi - - [[ $ACTSORT == sort ]] && do_active_sort=true -} - -wx_unedit() { - # Must be called via wx_eval - typeset -i force=0 - typeset arg msg - - # set positional args to contents of global $args - set -- $args - - while getopts :f arg; do - case $arg in - f) force=1;; - *) fail "Invalid flag -$OPTARG. See 'wx help' for"\ - "more info.";; - esac - done - - msg="differs from parent file, will remain in active list." - - if [[ ! -f SCCS/p.$file ]]; then - echo "$filepath not checked out" - else - if [[ $backup_done -eq 0 ]]; then - if [[ $force -eq 0 ]]; then - yesno "Do you want to backup files first?" - if [[ "$answer" == "yes" ]]; then - wx_backup || fail "Backup failed." - fi - else - # only backup if necessary - print "Will backup wx and active files if necessary" - wx_backup -t || fail "Backup failed." - fi - backup_done=1; - - # cd to the dir where the file is in case - # wx_backup took us somewhere else. - - cd ${workspace}/$dir - fi - - echo $filepath - if sccs unedit $silent $file; then - if [[ $force -eq 1 ]]; then - if is_active $filepath; then - if wx_pnt_filepath $filepath; then - if cmp -s $file $parentfilepath; then - remove_active_entry $filepath - else - print "$filepath $msg" - fi - fi - fi - else - ask_remove_active_entry - fi - fi - fi -} - -wx_create() { - # Must be called via wx_eval - typeset -i checkout=0 force=0 - typeset arg - - while getopts :fo arg; do - case $arg in - o) checkout=1;; - f) force=1;; - *) fail "Invalid flag -$OPTARG. See 'wx help' for"\ - "more info.";; - esac - done - - if [ ! -f $file ]; then - ring_bell - echo "Error! $filepath is not a file." - return 1 - elif [ -f $workspace/deleted_files/$filepath ]; then - ring_bell - cat >&2 <<-EOF -Error: a deleted version of $filepath exists. -You must undelete the file and edit that version. -Run: -'cd $workspace' -'$ME mv deleted_files/$filepath $filepath' -'$ME edit $filepath' - EOF - return 1 - elif [[ -n $parent && -f $parent/$filepath ]]; then - ring_bell - cat >&2 <<-EOF -Error! $filepath exists in the parent workspace $parent. -Choose a different name. - EOF - return 1 - elif [[ -n $parent && -f $parent/deleted_files/$filepath ]]; then - ring_bell - cat >&2 <<-EOF -Error! a deleted version of $filepath exists in the parent workspace -You must undelete the file and edit that version. -Run: -'cd $workspace' -'bringover deleted_files/$filepath' -'$ME mv deleted_files/$filepath $filepath' -'$ME edit $filepath' - EOF - return 1 - elif [ -f SCCS/s.$file ]; then - echo "$filepath already created, active list not"\ - "updated." >&2 - else - # XXX it would be nice if keyword would work on new files - if ! egrep "$SCCSKEYWORD" $file >/dev/null; then - ring_bell - cat >&2 <<-EOF - -Warning!!! -$filepath -is missing SCCS keywords. See -/net/wizard.eng/export/misc/general_docs/keyword_info.txt -for more info. Note, pay attention to the tabs. - EOF - if [[ $force -ne 1 ]]; then - yesno "Continue with create?" - if [[ "$answer" != 'yes' ]]; then - echo "Aborting create $filepath" - return 1 - fi - fi - fi - - if ! copyrightchk $file; then - # Sound bell - ring_bell - cat >&2 <<-EOF - -Warning!!! -$filepath -has copyright problems. See -/net/wizard.eng/export/misc/general_docs/golden_rules.txt -for more info. - EOF - if [[ $force -ne 1 ]]; then - yesno "Continue with create?" - if [[ "$answer" != 'yes' ]]; then - echo "Aborting create $filepath" - return 1 - fi - fi - fi - - if ! cddlchk -a $file; then - # Sound bell - ring_bell - cat >&2 <<-EOF - -Warning!!! -$filepath -has CDDL block problems. See -http://www.opensolaris.org/os/community/onnv/devref_toc/devref_7/#7_2_3_nonformatting_considerations -for more info. - EOF - if [[ $force -ne 1 ]]; then - yesno "Continue with create?" - if [[ "$answer" != 'yes' ]]; then - echo "Aborting create $filepath" - return 1 - fi - fi - fi - - if [[ ! -d SCCS ]]; then - mkdir SCCS || fail "Error: cannot create SCCS dir." - fi - - if [[ -n "$comment_file" ]]; then - sccs create $silent -y"$(\ - sed '/^[ ]*$/d' $comment_file)" $file || - fail "sccs create $filepath failed." - else - sccs create $silent $file || - fail "sccs create $filepath failed." - fi - rm -f ,$file - update_active $filepath - add_new $filepath - if [[ $checkout -eq 1 ]]; then - sccs edit $silent $file || - fail "sccs edit $filepath failed." - fi - [[ $ACTSORT == sort ]] && do_active_sort=true - fi -} - -wx_uncreate() { - # Must be called via wx_eval - # undoes a 'wx create' - - typeset efp - typeset -i force=0 - - case $1 in - -f) force=1;; - -*) fail "$ME $command: unrecognized argument";; - esac - - if [[ $backup_done -eq 0 ]]; then - if [[ $force -eq 0 ]]; then - yesno "Do you want to backup files first?" - if [[ "$answer" == 'yes' ]]; then - wx_backup || fail "Backup failed." - fi - else - # only backup if necessary - print "Will backup wx and active files if necessary" - wx_backup -t || fail "Backup failed." - fi - backup_done=1; - cd $workspace/$dir - fi - - if [[ ! -f $file ]]; then - echo "$filepath not found, skipping" - return 1 - fi - - efp=$(escape_re $filepath) - - if ! wx_pnt_filepath; then - # This is a new file so let's uncreate it. - answer='no' - if [[ $force -ne 1 ]]; then - cat <<-EOF - -$filepath appears to be a new file. -Note, $command will remove its SCCS info from your -workspace and entry in the active list but will leave -the file in your workspace. - - EOF - # yesno sets answer - yesno "Continue $command $filepath?" - else - # forced to yes - answer='yes' - fi - - if [[ "$answer" == 'yes' ]]; then - if [[ ! -f SCCS/p.$file ]]; then - sccs edit $file || - fail "sccs edit $filepath failed." - fi - rm -f SCCS/s.$file SCCS/p.$file - # For later cleanup on exit - if grep -q "^$efp " $wsdata/nametable 2>/dev/null; then - NEED_WS_CLEAN='y' - fi - - if is_active $filepath; then - remove_active_entry $filepath - fi - remove_new $filepath - else - echo "skipping $filepath" - fi - else - echo "Not new, skipping $filepath" - fi # if ! wx_pnt_filepath -} - -wx_reset() { - # Must be called via wx_eval - # resets a local file to the parent version - - typeset efp - typeset -i force=0 - - case $1 in - -f) force=1;; - -*) fail "$ME $command: unrecognized argument";; - esac - - if [[ $backup_done -eq 0 ]]; then - if [[ $force -eq 0 ]]; then - yesno "Do you want to backup files first?" - if [[ "$answer" == 'yes' ]]; then - wx_backup || fail "Backup failed." - fi - else - # only backup if necessary - print "Will backup wx and active files if necessary" - wx_backup -t || fail "Backup failed." - fi - backup_done=1; - fi - - if [[ ! -f $file ]]; then - print "$filepath not found, skipping" - return 1 - fi - - efp=$(escape_re $filepath) - - if wx_pnt_filepath; then - if [[ $force -ne 1 ]]; then - answer='no' # safe default - cat <<-EOF - -Regarding: $filepath -$command will reset the file contents and sccs history to that of the parent: -$parentfilepath -and remove the entry from the active and renamed lists. - - EOF - if [[ $filepath != $parentfile ]]; then - print "Note: local file will be reset to parent filepath." - fi - # yesno sets answer - yesno "Continue $command $filepath?" - else - # forced to yes - answer='yes' - fi - - if [[ "$answer" == 'yes' ]]; then - if is_active $filepath; then - remove_active_entry $filepath - fi - if renamed; then - remove_renamed_entry $filepath - fi - rm -f $file SCCS/[ps].$file - grep -v "^$efp " $wsdata/nametable > $wxtmp/nametable.new || \ - fail "Error: cannot create $wxtmp/nametable.new ." - mv -f $wxtmp/nametable.new $wsdata/nametable || \ - fail "Error: mv -f $wxtmp/nametable.new $wsdata/nametable failed." - - # add to bringover list for more efficient bringover - bofilelist="$bofilelist $parentfile" - else - print -u2 "Skipping $filepath" - fi - else - cat >&2 <<-EOF - -Warning: skipping $filepath -as it appears to be new. Use 'uncreate' to remove this new file from the -workspace. - EOF - fi # if ! wx_pnt_filepath -} - - -cyclic_rename() { - # Detect the cyclic rename that causes Teamware problems. - # See 'man workspace' for more info - typeset new_filepath=$1 old_filepath=$2\ - found_new=false found_old=false - typeset prev_new prev_old - - while read prev_new prev_old; do - if [[ "deleted_files/$new_filepath" == $prev_new && - $old_filepath != $prev_new ]]; then - - # Cyclic rename - return 0 - fi - - if [[ $new_filepath == $prev_old && $prev_new != $old_filepath ]] - then - # The new file was the old file of a previous rename - found_new=true - if $found_old; then - # Cyclic rename - return 0 - fi - elif [[ $old_filepath == $prev_new && - $new_filepath != $prev_old ]]; then - - # The old filepath was the new filepath of a - # previous rename and this rename is not an undo - # (new filepath is diff from previous old - # filepath) - - found_old=true - if $found_new; then - # Cyclic rename - return 0 - fi - fi - done < $wxdir/renamed - - # Not a cyclic rename - return 1 -} - -wx_delete() { - # Must be called via wx_eval - typeset efp - typeset -i force=0 - - case $1 in - -f) force=1;; - -*) fail "$ME $command: unrecognized argument";; - esac - - if [[ $backup_done -eq 0 ]]; then - if [[ $force -eq 0 ]]; then - yesno "Do you want to backup files first?" - if [[ "$answer" == 'yes' ]]; then - wx_backup || fail "Backup failed." - fi - else - # only backup if necessary - print "Will backup wx and active files if necessary" - wx_backup -t || fail "Backup failed." - fi - backup_done=1; - cd $workspace/$dir - fi - - if [[ ! -f $file ]]; then - fail "$filepath isn't a file." - fi - - # this is used a couple times so save escape_re value - efp=$(escape_re $filepath) - - if wx_pnt_filepath; then - # Not a new file (has a parent) - if is_active $filepath; then - ring_bell - cat >&2 <<-EOF - -Warning! $filepath -is in active list. You should run -"$ME reedit $filepath" -"$ME unedit $filepath" -which should remove it from the active list then run -"$ME $command $filepath". -Note, if you have made changes to this file that you want to keep, back -it up first. - -$filepath not deleted. - - EOF - return 1 - fi - # See if this is already in the renamed list - if grep -q "^deleted_files/$efp " $wxdir/renamed; then - ring_bell - if [[ -f $workspace/deleted_files/$filepath ]]; then - cat >&2 <<-EOF -Warning: $filepath -has already been deleted. -Check for deleted_files/$filepath -in $wxdir/renamed . - EOF - else - cat >&2 <<-EOF -Warning! the $ME renamed list appears to be corrupt. - EOF - fail "Please run '$ME update -r' and try this"\ - "command again." - fi - fi - if workspace filerm $file; then - # we know filerm renames files under deleted_files/ - update_renamed_file $filepath deleted_files/$filepath - - print "$filepath deleted" - print - print "To recover $filepath do:" - print "'cd $workspace'" - print "'$ME mv deleted_files/$filepath $filepath'" - else - print "There was an error while trying to delete $filepath" - fi - else - # This is a new file so let's remove it. - if is_active $filepath; then - ring_bell - cat >&2 <<-EOF - -Warning: $filepath -is in active list. You should run -"$ME uncreate $filepath" -which should remove it from the active list -then run "$ME $command $filepath". - -$filepath not deleted. - - EOF - return 1 - fi - - answer='no' - if [[ $force -ne 1 ]]; then - cat <<-EOF - -Warning: $filepath -appears to be a new file. - -Do you want to completely remove the file and SCCS info from -your workspace? (If you answer no, the file will just be -removed from the active list if it's in there. If you answer -yes, the file and associated SCCS history files will removed -from the active list and also removed entirely from the -workspace.) - - EOF - # yesno sets answer - yesno "Completely remove $filepath?" - else - # forced to yes - answer='yes' - fi - - if [[ "$answer" == 'yes' ]]; then - rm -f $file SCCS/s.$file - [[ -f SCCS/p.$file ]] && rm -f SCCS/p.$file - echo "$filepath removed from workspace." - # For later cleanup, optional - if grep -q "^$efp " $wsdata/nametable 2>/dev/null; then - NEED_WS_CLEAN='y' - fi - fi - remove_new $filepath - fi -} - -wx_mv() { - # create some local variables to avoid side effects - typeset efp old_filepath new_filepath - - cd $workspace - - old_filepath=$1 - new_filepath=$2 - - if [[ -d $old_filepath && ( -d $new_filepath || ! -f $new_filepath ) ]] - then - - if [[ $(basename $old_filepath) == "SCCS" ]]; then - return - fi - - echo "Doing a $command between two directories can take a "\ - "while, please be patient." - # deal with directory to directory move - if [[ -d $new_filepath ]]; then - base="$(basename $old_filepath)/" - else - base= - fi - - sccsmv $old_filepath $new_filepath || - fail "sccsmv $old_filepath $new_filepath failed." - - # remove previous renamed entry - remove_renamed_entry $old_filepath - - update_renamed_dir $new_filepath/$base - - if grep -q "^$efp/" $wsdata/nametable 2>/dev/null; then - # Old entries in workspace nametable so set this - # to clean up on exit - NEED_WS_CLEAN='y' - fi - - # rename path of active entry - sed "s|^$efp/|$new_filepath/$base|" $wxdir/active \ - > $wxtmp/active || fail "Error: cannot create $wxtmp/active." - mv $wxtmp/active $wxdir/active || - fail "Error: cannot create $wxdir/active." - sed "s|^$efp/|$new_filepath/$base|" $wxdir/new \ - > $wxtmp/new || fail "Error: cannot create $wxtmp/new." - mv $wxtmp/new $wxdir/new || fail "Error: cannot create $wxdir/new." - - elif [[ -f $old_filepath && -d $new_filepath ]]; then - wx_mv_file $old_filepath $new_filepath/$(basename $old_filepath) - elif [[ -f $old_filepath && ! -f $new_filepath ]]; then - wx_mv_file $old_filepath $new_filepath - elif [[ ! -f $old_filepath ]]; then - fail "Error! $old_filepath not found." - elif [[ -f $new_filepath ]]; then - fail "Error! $new_filepath exists." - fi -} - -wx_mv_file() { - # store literal filepath in local var. to avoid side effects - typeset efp old_filepath new_filepath - - cd $workspace - - old_filepath=$1 - new_filepath=$2 - - if [[ ! -f $old_filepath ]]; then - fail "Error! $old_filepath does not exist." - - elif [[ -f $new_filepath ]]; then - fail "Error! $new_filepath already exists." - - else - if cyclic_rename $new_filepath $old_filepath; then - fail "Cyclic renamed detected. See 'man workspace'"\ - "for more info." - fi - - if workspace filemv $old_filepath $new_filepath; then - update_renamed_file $old_filepath $new_filepath - efp=$(escape_re $old_filepath) - if is_active $old_filepath; then - # In active list so update list with new - # file name - rename_active_entry $old_filepath $new_filepath - fi - if grep -q "^$efp$" $wxdir/new; then - remove_new $old_filepath - add_new $new_filepath - fi - if grep -q "^$efp " $wsdata/nametable 2>/dev/null; then - NEED_WS_CLEAN=y - fi - else - echo "There was an error renaming $old_filepath to "\ - "$new_filepath" - fi - fi -} - -sccs_rmdel_done() { - # Note there are literal tabs in the []'s below so be careful when - # editing. - - # file not in SCCS so return false (1) - [[ ! -f SCCS/s.$file ]] && return 1 - - if wx_pnt_filepath; then - sccs prt -a $parentfilepath > $wxtmp/parenthist - sccs prt -a $file > $wxtmp/filehist - diff $wxtmp/parenthist $wxtmp/filehist | - grep '^> R [0-9]\.[0-9]'| - egrep -v ' (Codemgr|Fake)[ ]' | - sed 's/^> //' > $wxtmp/newrmdels - [[ ! -f $wxtmp/newrmdels ]] && fail "Error: cannot create $wxtmp/newrmdels" - rm -f $wxtmp/parenthist $wxtmp/filehist - else - # New file, no parent - sccs prt -a $file | - egrep -v \ - '^R [0-9]+(\.[0-9]+)+[ ].* (Codemgr|Fake)[ ]' | - egrep '^R [0-9]+(\.[0-9]+)+[ ]' > $wxtmp/newrmdels - [[ ! -f $wxtmp/newrmdels ]] && fail "Error: cannot create $wxtmp/newrmdels" - fi - - if [[ -s $wxtmp/newrmdels ]]; then - cat $wxtmp/newrmdels - rm -f $wxtmp/newrmdels - # an rmdel was done so return true - return 0 - else - rm -f $wxtmp/newrmdels - # no rmdel was done so return false - return 1 - fi -} - -rmdelchk() { - # returns 0 (success) if an rmdel was done. - # Should be called via wx_eval(). - if sccs_rmdel_done ; then - ring_bell - cat <<-EOF - -Warning, it looks like 'sccs rmdel' was run on $filepath -This will cause a problem for Teamware. Please fix this. -Note, this can be fixed by doing '$ME reedit $filepath' - EOF - return 0 - else - return 1 - fi -} - -wx_delget() { - typeset -i force=0 - typeset arg comment_found=false - - while getopts :f arg; do - case $arg in - f) force=1;; - *) fail "Invalid flag -$OPTARG. See 'wx help' for"\ - "more info.";; - esac - done - - if [[ (! -f SCCS/s.$file && ! -f SCCS/p.$file) || - (-f SCCS/s.$file && -f SCCS/p.$file) ]]; then - - # Check for keywords unless force is set or file is in - # keywords.NOT - if [[ $force -ne 1 ]] && [ -f SCCS/p.$file ] && - ! grep -q "^$(escape_re $filepath)$" \ - $wxdir/keywords.NOT 2>/dev/null && - ! keywords -p $file; then - - ring_bell - cat <<-EOF - -The keywords check has detected a problem with $filepath -If this check should be skipped for this file, put the filepath in -${wxdir}/keywords.NOT. -See /net/wizard.eng/export/misc/general_docs/keyword_info.txt -for more info about keywords. Note, pay attention to the tabs. - - EOF - yesno "Continue with $command for $filepath?" - if [[ "$answer" != 'yes' ]]; then - echo "Aborting $command $filepath\n" - return - fi - fi - - [[ -f $wxtmp/comment ]] && rm $wxtmp/comment - if [[ -n "$comment_file" ]]; then - # note hard tab in sed r.e. - sed '/^[ ]*$/d' $comment_file > $wxtmp/comment && - comment_found=true - else - wx_show_comment >$wxtmp/comment && comment_found=true - fi - if $comment_found; then - echo $filepath - cat $wxtmp/comment - if [[ -f SCCS/s.$file ]]; then - # file history so check in file - sccs delget $silent -y"`cat $wxtmp/comment`" \ - $file || - fail "sccs delget failed $filepath." - else - # no file history so create file - sccs create $silent -y"`cat $wxtmp/comment`" \ - $file || - fail "sccs create $filepath failed." - rm -f ,$file - fi - [[ -n "$comment_file" ]] && - update_active_comment $filepath - else - ring_bell - print "\nError: no comments (NO_COMMENT) registered for $filepath" - if [[ $force -ne 1 ]] ; then - yesno "Invoke ${EDITOR:-vi} to edit"\ - "$wxdir/active"'?' - if [ "$answer" == 'yes' ]; then - ${EDITOR:-vi} $wxdir/active - wx_delget - else - fail "Edit $wxdir/active and try again." - fi - else - fail "Edit $wxdir/active and try again." - fi - fi - elif [[ -f SCCS/s.$file && ! -f SCCS/p.$file ]]; then - echo "$filepath already checked in" - elif [[ ! -f SCCS/s.$file && -f SCCS/p.$file ]]; then - fail "Error, $filepath is missing SCCS/s.$file ." - fi -} - -wx_get() { - if [[ -f SCCS/s.$file ]]; then - sccs get $args -s $file || fail "sccs get $file failed." - else - ring_bell - echo "$filepath not in SCCS" - fi -} - -wx_info() { - if [ -f SCCS/p.$file ]; then - if [[ -w $file ]]; then - echo "$filepath (checked out)" - else - ring_bell - echo "$filepath (Warning, inconsistent state." - echo " SCCS/p.$file exists but $file is readonly.)" - fi - elif [[ ! -f $file ]]; then - ring_bell - echo "$filepath (Warning, not found in $workspace)" - elif [[ ! -f SCCS/s.$file ]]; then - ring_bell - echo "$filepath (Warning, not in SCCS)" - else - echo "$filepath (checked in)" - fi - echo "Check-in comment:" - wx_show_comment - if [ -f SCCS/s.$file ]; then - echo "Most recent delta: \c" - sccs prt -y $file - fi - echo "File name status:" - if renamed; then - # old is set by renamed - echo "Locally renamed, parent file = $parentfile" - elif lookup_parent $filepath; then - # parentfile is set by lookup_parent - if [[ "$filepath" != "$parentfile" ]]; then - echo "In parent ws, file renamed to: $parentfile" - else - echo "Same as parent." - fi - else - echo "New file (does not exist in parent ws)." - fi - echo -} - -get_multi_deltas() { - # Get list of files with more that one delta when putback. - # set global multi_delta_list. - if ! deltachk >/dev/null 2>&1; then - multi_delta_list="$multi_delta_list $filepath" - fi -} - -wx_reedit() { - typeset -i numkids=`workspace children | wc -l` - typeset i newfiles only_multideltas=false - - case $1 in - -m) only_multideltas=true;; - -*) fail "Invalid flag $1. See 'wx help' for more"\ - "info.";; - esac - - if [[ ! -f $wsdata/nametable ]]; then - echo "$wsdata/nametable not found, all files assumed new." - ok_to_proceed "Okay to continue with $command?" - elif [[ ! -r $wsdata/nametable ]]; then - fail "Error: cannot read $wsdata/nametable." - fi - - if $only_multideltas; then - # get_multi_deltas sets multi_delta_list - wx_eval get_multi_deltas - # set file_list for wx_eval wx_reedit_file below - file_list=$multi_delta_list - fi - - cd $workspace - - for i in $file_list; do - if [[ ! -f $i ]]; then - fail "$i does not exist." - fi - if ! lookup_parent $i; then - if [[ -z $newfiles ]]; then - newfiles="$i" - else - newfiles="$newfiles\n$i" - fi - fi - done - - if [[ -n $newfiles ]]; then - # If there are some new files, give user a warning - cat <<-EOF | ${PAGER:-more} - -$ME thinks following files are new (not in parent workspace) and will -reset their file histories to version 1.1 (exit if this list isn't correct): -$(echo $newfiles) - - EOF - ok_to_proceed "Okay to continue with $command?" - if ! $CHECKIN; then - cat <<-EOF - -Hint, use '$ME redelget' to collapse/reset new file histories to version -1.1 since '$ME $command' will check out the file and '$ME delget' always -increments the file version doing the check in. - - EOF - fi - fi - - if [ $numkids -gt 0 ]; then - echo "WARNING: This workspace has the following children:" - echo - workspace children - echo - echo "The reedit command will coalesce all children's deltas" - echo "into one, losing all delta comments in the process." - ok_to_proceed 'Are you sure you want to proceed?' - fi - echo - yesno "Do you want to backup files first?" - if [[ "$answer" == 'yes' ]]; then - wx_backup || fail "Backup failed." - fi - - echo "$command beginning..." - echo - wx_eval wx_reedit_file - echo - echo "$command complete" - echo - [[ $ACTSORT == sort ]] && do_active_sort=true -} - -wx_reedit_file() { - # Must be called via wx_eval - typeset comment_found=false - - if [[ ! -f $file ]]; then - echo "$file does not exist. Can not reedit $file" - return - fi - - echo $filepath - # Is there a parent file? - if wx_pnt_filepath; then - rm -f $wxtmp/s.$file - cp -p $parentsdot $wxtmp/s.$file || - fail "Error: cannot cp $parentsdot $wxtmp/s.$file ." - - # get the latest parent delta and comment and filter out - # certain fields removing trailing spaces - - p_delta="$(sccs prt -y $parentsdot|expand -1|grep 'SCCS'|\ - cut -f'4,5,6,9-' -d' '|sed 's/ *$//')" - - if [[ -z "$p_delta" ]]; then - ring_bell - echo "Warning ${command}: skipping $filepath," - echo "cannot get parent delta info" - echo - return 1 - fi - - # create a list of local deltas in the same format - # also removing trailing spaces - sccs prt $file|expand -1| - nawk ' - /^D [0-9]+(\.[0-9]+)+ +[0-9][0-9]\/[0-9][0-9]/ { - if (delta != "") { - # print previous delta info - print delta comment; - } - delta=sprintf("%s %s %s %s ",$3, $4, $5, $8); - comment = ""; - } - ! /^D [0-9]+(\.[0-9]+)+ +[0-9][0-9]\/[0-9][0-9]/ { - # Add comment lines to comment variable - if (comment == "") { - if (NF > 0) { - comment = $0; - } else { - # empty lines require a space - # in comment. - comment = " "; - } - } else { - if (NF > 0) { - comment = comment " " $0; - } else { - comment = comment " "; - } - } - } - END { - if (delta != "") { - # print last delta info - print delta comment; - } - }' | sed 's/ *$//' > $wxtmp/l_deltas || - fail "Error: cannot create $wxtmp/l_deltas." - - # If the latest parent delta doesn't appear in the local file - # then a bringover is required. Use fgrep because comment may - # have RE chars in it. - if ! fgrep "$p_delta" $wxtmp/l_deltas >/dev/null; then - ring_bell - echo "\nWarning ${command}: skipping $filepath because:" - echo "parent's version of $filepath" - echo "is newer than child's -- bringover required." - echo - return 1 - fi - - if [ ! -f SCCS/p.$file ]; then - if sccs edit $silent $file; then - update_active $filepath - else - fail "sccs edit $file failed." - fi - fi - - # make copy of local file and copy parent's SCCS s. file over - # local. - mv -f $file ${file}.wx_reedit || - fail "mv -f $file ${file}.wx_reedit failed." - rm -f SCCS/s.$file SCCS/p.$file - cp $wxtmp/s.$file SCCS/s.$file || - fail "cp $wxtmp/s.$file SCCS/s.$file failed." - - if sccs edit $silent $file; then - update_active $filepath - else - fail "sccs edit $file failed." - fi - - mv -f ${file}.wx_reedit $file || - fail "mv -f ${file}.wx_reedit $file failed." - - if $CHECKIN; then - wx_delget - fi - touch $file - else - # reediting a new file. - if [[ -f SCCS/s.$file ]]; then - if [[ ! -f SCCS/p.$file ]]; then - # File needs to be checked out - sccs edit $silent $file || - fail "sccs edit $file failed." - fi - # clean up SCCS since we are going to create again. - rm -f SCCS/s.$file - fi - # clean up SCCS since we are going to create again. - [[ -f SCCS/p.$file ]] && rm -f SCCS/p.$file - - [[ -f $wxtmp/comment ]] && rm $wxtmp/comment - wx_show_comment >$wxtmp/comment && comment_found=true - if $comment_found; then - echo $filepath - cat $wxtmp/comment - rm -f SCCS/s.$file SCCS/p.$file - sccs create $silent -y"`cat $wxtmp/comment`" $file || - fail "sccs create $filepath failed." - rm -f ,$file - [[ -n "$comment_file" ]] && - update_active_comment $filepath - else - ring_bell - echo "\nError, no comments registered for $filepath" - if [[ $force -ne 1 ]] ; then - yesno "Invoke ${EDITOR:-vi} to edit"\ - "$wxdir/active"'?' - if [[ "$answer" == 'yes' ]]; then - ${EDITOR:-vi} $wxdir/active - wx_reedit_file - else - fail "Edit $wxdir/active and try again." - fi - else - fail "Edit $wxdir/active and try again." - fi - fi - - if $CHECKIN; then - # No need to check out file. - return - fi - - if sccs edit $silent $file; then - update_active $filepath - add_new $filepath - else - fail "sccs edit $file failed." - fi - fi -} - -# -# Warn if there are sccs delta issues -# -deltachk() { - # must be run via wx_eval - typeset -i numdeltas - typeset newfile checkedout=false - - if wx_pnt_filepath; then - # find number of deltas by subtracting the number in the parent - # from the local file (note the literal Control-A in the grep - # R.E.s below). - (( numdeltas = $(grep '^d D' SCCS/s.$file|wc -l) - \ - $(grep '^d D' $parentsdot|wc -l) )) - newfile=false - else - # checking a new file (note the literal Control-A in the grep - # R.E.) - numdeltas=$(grep '^d D' SCCS/s.$file|wc -l) - newfile=true - fi - - if [[ -z $numdeltas ]]; then - cat <<-EOF - -Warning: the local file: -$filepath -does not appear to have a sccs delta history file or the sccs delta -history file is corrupt. If the local file is new try using: -"cd $dir" -"$ME create $file" - -If the file is not new (exists in parent): -"cd $dir" -Save a copy of the local file -Remove the SCCS/[ps].$file history files -"bringover $filepath" -"$ME edit $file" -Then carefuly merge the saved copy of local file with the -file brought over from parent. Hint: twmerge is a good merge -tool. - EOF - return 1 - fi - - [[ -f SCCS/p.$file ]] && checkedout=true - - # Note the use of hard tabs in the messages - case $numdeltas in - 0) if $checkedout; then - # file is checked out so assume there - # will be 1 delta when checked in. - return 0 - else - if [[ -n $parentfilepath ]]; then - if cmp -s $file $parentfilepath; then - cat <<-EOF - -Warning: the local file: -$filepath -and the parent file: -$parentfilepath -content are identical. There are no new deltas in the local file. -If this file is no longer required in the active list use: -"cd $dir" -"$ME reset $file" -to remove file from the wx state files (active list, etc...) - EOF - else - cat <<-EOF - -Warning: the local file: -$filepath -and the parent file: -$parentfilepath -have the same number of deltas but contents differ. A bringover may be -required before putback. - EOF - fi - else - cat <<-EOF - -Warning: the local file: -$filepath -is new but doesn't appear to contain any deltas. The SCCS delta history file -may need to be recreated. If so: -"cd $dir" -"rm SCCS/s.$file" -"$ME create $file" - EOF - fi - return 1 - fi ;; - - 1) if $checkedout; then - cat <<-EOF - -Regarding $filepath -Warning! There may be more than 1 delta when you check this file in -(currently checked out). Run '$ME redelget' on this file to collapse -the deltas and check in with 1 delta unless putting back > 1 bug. - EOF - return 1 - else - return 0 - fi ;; - - -*) # a negative number means the parent has more deltas - - cat <<-EOF - -Regarding $filepath -Warning! The parent file has more deltas than the local file. -You should bringover the local file to fix this. - EOF - ;; - - *) if $newfile && $checkedout; then - cat <<-EOF - -Regarding $filepath -Warning! There may be more than 1 delta when you check this file in -(currently checked out). Run '$ME redelget' on this file to collapse -the deltas and check in with 1 delta unless putting back > 1 bug. - EOF - else - cat <<-EOF - -Regarding $filepath -Warning! There is more than 1 delta. Run: -'cd $dir; $ME redelget $file' -to collapse the deltas on this file and check in with 1 delta unless -putting back > 1 bug. - EOF - fi - return 1;; - esac -} - -wx_cstyle() { - case $file in - *.[ch]) ;; - *) return;; - esac - ((CSTYLE_INDEX = CSTYLE_INDEX + 1)) - (cd $workspace; - cstyle ${CSTYLE_FLAGS} $args $filepath >\ - $wxtmp/wx.cstyle.$CSTYLE_INDEX) & -} - -wx_jstyle() { - case $file in - *.java) ;; - *) return;; - esac - ((JSTYLE_INDEX = JSTYLE_INDEX + 1)) - (cd $workspace; - jstyle ${JSTYLE_FLAGS} $args $filepath >\ - $wxtmp/wx.jstyle.$JSTYLE_INDEX) & -} - -wx_find_compression_progs() { - gzip=/usr/bin/gzip - if [[ ! -x $gzip && -n "$GZIPBIN" ]]; then - gzip=$GZIPBIN - fi - - bzip2=/usr/bin/bzip2 - if [[ ! -x $bzip2 && -n "$BZIP2BIN" ]]; then - bzip2=$BZIP2BIN - fi -} - -wx_get_backup_dir() { - typeset backup_dir_file - # if backup_dir hasn't been set already... - if [[ -z "$backup_dir" ]]; then - # use the backup dir specifier in the wx/ - backup_dir_file=$wxdir/backup_dir - if [[ ! ( -f $backup_dir_file && -r $backup_dir_file && - -s $backup_dir_file ) ]]; then - fail "$backup_dir_file: missing, empty, or not readable" - fi - backup_dir=`cat $backup_dir_file` - fi - if [[ ! ( -d $backup_dir && -x $backup_dir && -r $backup_dir ) ]]; then - fail "$backup_dir: missing, not a directory, or bad permissions" - fi -} - -# -# This code requires that the files (n.sdot, n.pdot and n.clear) for a given -# backup have the same extension (.tar, .tar.gz, or .tar.bz2). It also -# disallows the existance of two incarnations of the same file (i.e. -# n.clear.tar and n.clear.tar.gz) -# -# It's up to the user to straighten things out if the above conditions are -# violated. The only time that is a problem is if they are trying to -# restore a version which violates the above rules. -# -# Takes one argument, the version number. -# -# Returns: -# (return code) 0 if exists and consistent, -# 1 if not found, -# 2 if inconsistent -# b_clear, b_sdot, b_pdot On success, the full path to the clear, sdot -# and pdot files comp, ext The compression program for and -# extension of said files -# -wx_check_backup() { - typeset _new _b_new _renamed _b_renamed _active _b_active \ - _local_nt _b_local_nt found bad - - _version=$1 - clear=$_version.clear.tar - sdot=$_version.sdot.tar - pdot=$_version.pdot.tar - not=$_version.not.tar - _renamed=$_version.renamed - _b_renamed=$backup_dir/$_renamed - _new=$_version.new - _b_new=$backup_dir/$_new - _active=$_version.active - _b_active=$backup_dir/$_active - _local_nt=$_version.local_nametable - _b_local_nt=$backup_dir/$_local_nt - _sort=$_version.sort_active - _b_sort=$backup_dir/$_sort - found=false - bad=false - # - # these arrays must be in sync with: - # 1. the immediately following _count variable - # 2. wx_find_last_backup's egrep expression - # 3. wx_backup's "$args" handling. - # 4. wx_find_compression_progs's programs - # - set -A _comps "" "$gzip" "$bzip2" - set -A _extns "" ".gz" ".bz2" - _count=3 - - idx=0 - while [[ $idx -lt $_count ]] ; do - _ext=${_extns[$idx]} - _comp=${_comps[$idx]} - _clear=$clear$_ext - _sdot=$sdot$_ext - _pdot=$pdot$_ext - _b_clear=$backup_dir/$_clear - _b_sdot=$backup_dir/$_sdot - _b_pdot=$backup_dir/$_pdot - - if [[ -f $_b_clear || -f $_b_sdot ]]; then - if $found; then - echo "$backup_dir: both $_version.*.tar$ext "\ - "and $_version.*.tar$_ext exist" - bad=true - else - ext=$_ext - comp=$_comp - found=true - fi - fi - - if [[ -f $_b_clear && ! -f $_b_sdot ]]; then - echo "$backup_dir: $_clear exists; $_sdot does not" - bad=true - elif [[ ! -f $_b_clear && -f $_b_sdot ]]; then - echo "$backup_dir: $_sdot exists; $_clear does not" - bad=true - elif [[ ! -f $_b_sdot && -f $_b_pdot ]]; then - echo "$backup_dir: $_pdot exists; $_sdot does not" - bad=true - fi - idx=`expr $idx + 1` - done - - if [[ ! -f $_b_renamed && -f $_b_active ]]; then - # Can determine compression only - return 1 - fi - - if [[ -f $_b_renamed && -f $_b_active && -f $_b_new && - -f $_b_local_nt ]]; then - found=true - else - bad=true - fi - - $bad && return 2 - $found || return 1 - - b_renamed=$_b_renamed - b_new=$_b_new - b_active=$_b_active - b_local_nt=$_b_local_nt - - if [[ -f $backup_dir/$clear$ext && -f $backup_dir/$sdot$ext ]]; then - b_clear=$backup_dir/$clear$ext - b_sdot=$backup_dir/$sdot$ext - else - b_clear= - b_sdot= - fi - - # It's not an error if this doesn't exist. - if [[ -f $backup_dir/$pdot$ext ]]; then - b_pdot=$backup_dir/$pdot$ext - else - b_pdot= - fi - # It's not an error if this doesn't exist. - if [[ -f $backup_dir/$not ]]; then - b_not_files=$backup_dir/$not - else - b_not_files= - fi - # It's not an error if this doesn't exist. - if [[ -f $_b_sort ]]; then - b_sort=$_b_sort - else - b_sort= - fi - - return 0 -} - -# -# finds the number of the last backup. -# -# Returned in $result, which is -1 if no backups are found -# -wx_find_last_backup() { - # - # The list of extensions in the egrep expression must be in sync - # with wx_check_backup's arrays - # - result=`ls -1 $backup_dir | egrep \ - '^[0-9][0-9]*\.((pdot|sdot|clear)\.tar($|\.gz$|\.bz2$)|active|renamed|new|local_nametable$)'| \ - sed 's/^\([0-9][0-9]*\)\..*$/\1/'| sort -rn | head -1` - - [[ -n "$result" ]] # fail if result is empty -} - -# -# wx_do_backup -# Returns 0 on successful backup, 1 if nothing to backup, 2 any other -# error. -# - -wx_do_backup() { - _type=$1 # type of files (for user) - _out=$2 # file to write to - _comp="$3" # compression program, or empty for no compression - _evalarg=$4 # arg to wx_eval to get the correct file list - typeset backupfiles=$(wx_eval "$_evalarg") - - echo - echo "Saving $_type files to $_out" - echo - - if [[ -z $backupfiles ]]; then - echo "Note, nothing to backup." - return 1 - fi - - if [[ -n "$_comp" ]]; then - ( tar cvf - $backupfiles 2>$BACKUP_ERRORS || \ - rm -f $_out ) | $_comp -9 -c > $_out || rm -f $_out - else - tar cvf $_out $backupfiles 2>$BACKUP_ERRORS || - rm -f $_out - fi - - [[ -f "$_out" ]] || return 2 # $_out is removed on any error - - return 0 -} - -wx_do_restore() { - _type=$1 # type of files (for user) - _in=$2 # file to read from - _comp="$3" # uncompressing program - echo - echo "Restoring $_type files from $_in" - echo - - if [[ -n "$_comp" ]]; then - # - # if decompression fails, echo a bad value to make tar fail - # - ($_comp -dc < $_in || echo "fail") | tar xvpf - || return 1 - else - tar xvpf $_in || return 1 - fi - return 0 -} - -# -# do renames in a workspace from a backup set -# - -wx_do_renames() { - typeset _in=$1 # file to read from - - if [[ ! -f $wsdata/nametable ]]; then - echo "$wsdata/nametable not found, not doing renames." - return 0 - fi - - echo - echo "Restoring renamed files from $_in" - echo - - # Note this assumes we're staring in $workspace - - while read new hash1 hash2 hash3 hash4; do - # get current local file name - current=$(grep " $hash1 $hash2 $hash3 $hash4$" \ - $wsdata/nametable | cut -f1 -d' ') - - if [[ -z $current ]]; then - # nothing to rename - continue - fi - - if [[ "$new" == "$current" ]]; then - # rename not needed - continue - fi - - if [[ ! -f $new ]]; then - if [[ ! -d $(dirname $new) ]]; then - mkdir -p $(dirname $new) || - fail "Error: cannot create dir $(dirname $new)" - fi - echo "Renaming current workspace file $current to $new" - workspace filemv $current $new - else - if [[ -f $current ]]; then - ring_bell - cat >&2 <<-EOF - -Warning: $current -and $new -files both exist in current workspace with the -same hash. The restored renamed list should be recreated by running: -'$ME update -r' -Skipping rename of $current -to $new - EOF - - fi - fi - done < $_in - - return 0 -} - -wx_backup() { - typeset orig_file_list ws_file back_file - typeset newer=false - typeset origdir=$PWD - - case $1 in - -i) wx_get_backup_dir - echo "Backup dir is $backup_dir" - ls -ltr $backup_dir - echo "Backup dir is $backup_dir" - cd $origdir - return ;; - -t) newer=true - # backup if wx files are newer than last backup. - # Implies use of default compression and no - # interaction. Doing shift so case further down - # won't see -t. - shift;; - esac - # save state in case wx_backup called from another command. - orig_file_list=$file_list - - # we always backup the active files. - file_list=$(wx_active) - - if [[ ! -s $wxdir/renamed && -z $file_list ]]; then - echo "There isn't anything to backup." - file_list=$orig_file_list - return 0 - fi - - # must be in workspace to do backup - cd $workspace || fail "Error: cannot cd $workspace" - - if $newer; then - # get latest wx state files and active files but skip - # wx/tmp and wx/*.old files. - ws_file=$(ls -1t $wxdir/!(tmp|*.old) $file_list|head -1) - # get latest backup. - wx_get_backup_dir - back_file=$(ls -1t $backup_dir/*|head -1) - if [[ ( -z "$back_file" && -n "$ws_file" ) || \ - (( -n "$back_file" && -n "$ws_file" ) && \ - $ws_file -nt $back_file ) ]] - then - : # continue with backup - else - print "Skipping backup, last backup newer than wx"\ - "files." - file_list=$orig_file_list - cd $origdir - return 0 - fi - fi - - wx_find_compression_progs - wx_get_backup_dir - - if [[ ! -w $backup_dir ]]; then - fail "$backup_dir: not writable" - fi - - if wx_find_last_backup; then - prev_backup=$result - version=`expr $result + 1` - else - prev_backup= - version=0 - fi - - # - # This must be in sync with wx_check_backup's arrays - # - case $1 in - -n) ext=; comp=;; - -z) ext=.gz; comp=$gzip;; - -b) ext=.bz2; comp=$bzip2;; - "-") shift;; # treat this as use default compression - "") ;; # treat this as use default compression - -??*) fail "$ME $command: only accepts a single argument";; - *) fail "$ME $command: unrecognized argument";; - esac - - if [[ -z "$1" ]]; then - # - # default to the compression of the previous backup - # - if [[ -z "$prev_backup" ]]; then - ext= - comp= - else - wx_check_backup $prev_backup - # A return of 1 is okay - if [ $? -gt 1 ]; then - echo "$backup_dir/$prev_backup.*: "\ - "cannot determine previous "\ - "compression." - if $newer; then - # Assume we want backup. - answer="yes" - else - yesno "Proceed with no "\ - "compression?" - fi - if [[ $answer == "no" ]]; then - echo "No backup done." - file_list=$orig_file_list - cd $origdir - return - fi - ext= - comp= - fi - fi - fi - - if [[ -n "$comp" && ! -x "$comp" ]]; then - echo "${comp}: missing. defaulting to no compression" - ext= - comp= - fi - - b_clear=$backup_dir/$version.clear.tar$ext - b_sdot=$backup_dir/$version.sdot.tar$ext - b_pdot=$backup_dir/$version.pdot.tar$ext - b_local_nt=$backup_dir/$version.local_nametable - b_active=$backup_dir/$version.active - b_renamed=$backup_dir/$version.renamed - b_new=$backup_dir/$version.new - b_not_files=$backup_dir/$version.not.tar - b_sort=$backup_dir/$version.sort_active - - # - # If anything goes wrong, clean up after ourselves - # - trap "/usr/bin/rm -f $b_clear $b_sdot $b_pdot $b_active $b_renamed $b_new $b_local_nt $b_not_files $b_sort; exit 1" 0 1 2 3 15 - - fail_msg='failed. Cleaning up. ' - - # - # It is not a hard error for the SCCS/s.file to be missing. We just - # let the user know what's going on. - # - sdot_cmd=' -_sdot="SCCS/s.$file"; -_file="$dir/$_sdot"; -if [[ -f $_sdot ]]; then - echo "$_file"; -else - echo "$_file: not found" >&2; -fi -' - pdot_cmd=' -_pdot="SCCS/p.$file"; -_sdot="SCCS/s.$file"; -_file="$dir/$_pdot"; -if [[ -f $_pdot ]]; then - echo "$_file"; -elif [[ ! -f $_sdot ]]; then - echo "$_file: not checked in" >&2; -elif [[ -w $file ]]; then - echo "$_file: not found but $file is writable!" >&2; -fi -' - # Do this first in case there are no active files - echo - echo "Saving renamed file list to $b_renamed" - echo - cp $wxdir/renamed $b_renamed || fail "$b_renamed: $fail_msg" - - if [[ -f $wxdir/local_nametable ]]; then - echo - echo "Saving local_nametable to $b_local_nt" - echo - cp $wxdir/local_nametable $b_local_nt || \ - fail "$b_local_nt: $fail_msg" - fi - - if [[ -f $wxdir/sort_active ]]; then - print - print "Saving sort_active to $b_active" - print - cp $wxdir/sort_active $b_sort || fail "$b_sort: $fail_msg" - fi - - if ls wx/*.NOT >/dev/null 2>&1; then - echo - echo "Saving .NOT files to $b_not_files" - echo - tar -cf $b_not_files wx/*.NOT || fail "$b_not_files: $fail_msg" - fi - - # Are there any active files to backup? - if [[ -n $file_list ]]; then - wx_do_backup 'clear' $b_clear "$comp" 'echo $filepath' || - fail "$b_clear: $fail_msg" - - wx_do_backup 'sdot' $b_sdot "$comp" "$sdot_cmd" || - fail "$b_sdot: $fail_msg" - - echo - echo "Saving new list to $b_new" - echo - cp $wxdir/new $b_new || fail "$b_new: $fail_msg" - - # It's not fatal if the backup error for pdot files is - # 'no files to backup'. This is because it's possible - # that the active files aren't checked out so there - # won't be any pdot files. - wx_do_backup 'pdot (if any)' $b_pdot "$comp" "$pdot_cmd" - if [[ $? -gt 1 ]]; then - fail "$b_pdot: $fail_msg $(cat $BACKUP_ERRORS)" - fi - fi - - echo - echo "Saving active file list to $b_active" - echo - cp $wxdir/active $b_active || fail "$b_active: $fail_msg" - - trap - 0 1 2 3 15 - - rm -f $BACKUP_ERRORS - - # restore file_list state. - file_list=$orig_file_list - - cd $origdir - return 0 -} - -wx_restore() { - typeset force=0 - - case $1 in - -f) force=1;; - -*) fail "Invalid flag $1. See 'wx help' for more info.";; - esac - - if [[ $force -eq 0 ]]; then - cat <<-EOF - -Warning, the restore command will overwrite several files including the -active and renamed lists. This could be a problem if you have made -changes to your workspace and $ME related files following the last -backup. It may be a good idea to run: - -$ME update - -after the restore so that the active and renamed lists are updated with -the new changes in the workspace. - -Also, restore may perform workspace renames in this workspace if it -finds that the existing file has a pathname that differs from that in -the backup being restored. - - EOF - ok_to_proceed "Do you really want to do the restore?" - fi - - wx_find_compression_progs - wx_get_backup_dir - - if wx_find_last_backup; then - version=$result - else - fail "$backup_dir: no backups found" - fi - - if [[ $force -eq 0 ]]; then - ask 'Version to restore from' $version - version=$answer - fi - - # - # wx_check_backup sets $comp, $b_clear, and $b_sdot when successful - # - if wx_check_backup $version; then - : - else - if [[ $? -eq 2 ]]; then - fail "$backup_dir/$version.*: unable to restore"\ - "inconsistent version" - else - fail "$backup_dir: Unable to find version $version" - fi - fi - - b_active=$backup_dir/$version.active - - if [[ -n "$comp" && ! -x "$comp" ]]; then - fail "${comp}: missing -- cannot decompress $b_clear" - fi - - # must be in workspace to do restore - cd $workspace || fail "Error: cannot cd $workspace" - - [[ -f $b_renamed ]] || fail "$b_renamed: missing" - [[ -f $b_new ]] || fail "$b_new: missing" - [[ -f $b_active ]] || fail "$b_active: missing" - - [[ -r $b_renamed ]] || fail "$b_renamed: not readable" - [[ -r $b_new ]] || fail "$b_new: not readable" - [[ -r $b_active ]] || fail "$b_active: not readable" - - if [[ -f $b_clear ]]; then - [[ -r $b_clear ]] || fail "$b_clear: not readable" - fi - if [[ -f $b_sdot ]]; then - [[ -r $b_sdot ]] || fail "$b_sdot: not readable" - fi - if [[ -f $b_pdot ]]; then - [[ -r $b_pdot ]] || fail "$b_pdot: not readable" - fi - if [[ -f $b_local_nt ]]; then - [[ -r $b_local_nt ]] || fail "$b_local_nt: not readable" - fi - if [[ -f $b_not_files ]]; then - [[ -r $b_not_files ]] || fail "$b_not_files: not readable" - fi - if [[ -f $b_sort ]]; then - [[ -r $b_sort ]] || fail "$b_sort: not readable" - fi - - # - # If something goes wrong, we need to make sure they notice, so - # we make the message quite visible, and echo a BELL. - # - fail_msg='Extraction failed. - - *DANGER* *DANGER* workspace could be corrupted *DANGER* *DANGER*' - - cp $b_renamed $wxdir/renamed || fail "$wxdir/renamed: $fail_msg" - cp $b_new $wxdir/new || fail "$wxdir/new: $fail_msg" - cp $b_active $wxdir/active || fail "$wxdir/active: $fail_msg" - cp $b_local_nt $wxdir/local_nametable || - fail "$wxdir/local_nametable: $fail_msg" - if [[ -n $b_sort ]]; then - cp $b_sort $wxdir/sort_active || \ - fail "$wxdir/sort_active: $fail_msg" - fi - - # Need to move active files that are renamed in current ws back to - # their name in the active list to avoid two copies of the file - # occuring when the clear files are restored below. - wx_do_renames $wxdir/local_nametable || - fail "$wxdir/local_nametable: $fail_msg" - - if [[ -n $b_not_files ]]; then - tar -xf $b_not_files || fail "$wx/*.NOT: $fail_msg" - fi - # It's not an error if there is no clear backup. - if [[ -f $b_clear ]]; then - wx_do_restore "clear" $b_clear "$comp" || - fail "$b_clear: $fail_msg" - fi - # It's not an error if there is no sdot backup. - if [[ -f $b_sdot ]]; then - wx_do_restore "sdot" $b_sdot "$comp" || - fail "$b_sdot: $fail_msg" - fi - # It's not an error if there is no pdot backup. - if [[ -f $b_pdot ]]; then - wx_do_restore "pdot" $b_pdot "$comp" || - fail "$b_pdot: $fail_msg" - fi - - # Do some integrity checking - for filepath in $(wx_active); do - if cd ${workspace}/$(dirname $filepath); then - file=$(basename $filepath) - - # If file is not writable then assume the - # SCCS/p.file is bogus. This can happen if a - # file is checked out and a wx restore is done - # and the restored file was not checked out when - # it was backed up. - - if [[ ! -w $file && -f SCCS/p.$file ]]; then - ring_bell - cat <<-EOF - -Warning! $filepath is in inconsistent state. -$filepath is not writable and SCCS/p.$file exists. -Removing SCCS/p.$file -To edit the file run '$ME edit $filepath' - EOF - rm -f SCCS/p.$file - elif [[ -w $file && ! -f SCCS/p.$file ]]; then - ring_bell - cat <<-EOF - -Warning! $filepath is in inconsistent state. -$filepath is writable -but there is no SCCS/p.$file - - EOF - yesno "Should this file be checked out?" - if [[ "$answer" == 'yes' ]]; then - if mv $file $wxtmp; then - if sccs edit $file; then - update_active $filepath - fi - mv -f $wxtmp/$file $file - fi - else - ask_remove_active_entry - echo "Setting $filepath read only" - chmod ugo-w $file - fi - fi - else - ring_bell - echo "\nWarning! Could not check sccs state of "\ - "$filepath" - fi - done -} - -wx_fullreview() { - if wx_pnt_filepath; then - : - else - parentfilepath=/dev/null - fi - if $show_comments && wx_show_comment > $wxdir/comment; then - comm=-y"`cat $wxdir/comment`" - codereview "$comm" $args $parentfilepath $workspace/$filepath - else - codereview $args $parentfilepath $workspace/$filepath - fi -} - -# -# Check on RTI status for bug ID's found in active list comments. -# - -wx_rtichk() { - # gate contains the gate dir, not full path - typeset gate=${parent##*/} - typeset -i rc=0 - typeset nolookup opt - - if [[ -f $wxdir/rtichk.NOT ]]; then - print "\nSkipping RTI check:" - return - else - print "\nDoing RTI check:" - fi - - while getopts :N opt; do - case $opt in - N) nolookup='-N' ;; - *) fail "Invalid flag -$OPTARG." ;; - esac - done - - # Note, rtichk needs a gate arg to correctly determine status. - if [[ -z $gate ]]; then - cat >&2 <<-EOF -Warning: cannot find a parent gate, skipping RTI checking. - EOF - fi - - # Use wx_summary to output bug ID's in active list comments, - # redirecting warnings about non-bug ID's to file for later use. - set -A bugs $(wx_summary -ao $nolookup 2>$wxtmp/bugwarnings|cut -f1 -d' ') - rtichk -g $gate ${bugs[@]} - rc=$? - - if [[ -s $wxtmp/bugwarnings ]]; then - cat <<-EOF - -There are issues with the bug ID format in the -$wxdir/active file. -Please fix the following and run rtichk again: - - EOF - cat $wxtmp/bugwarnings - ((rc = 1)) - fi - if [[ ${#bugs} -eq 0 ]]; then - print "\nWarning: no bug ID's in active list." - fi - return $rc -} - -# -# Do a Teamware putback of active and renamed files. -# -wx_putback() { - # Use pbargs array to store Teamware putback args. - # verbatim is for -v verbatim flag which doesn't get passed to - # putback. - set -A pbargs - typeset i verbatim pbfiles narg=false force=false - typeset nolookup=false - - if $FILES_PASSED; then - # use the user specified files - pbfiles=$file_list - else - # use the pblist (active and renamed) - pbfiles=$(wx_active -p) - fi - - while getopts :fnp:qvN i; do - case $i in - # Force the putback (no user interaction) - f) force=true;; - - n) narg=true - pbargs[${#pbargs[@]}]="-$i" ;; - - q) pbargs[${#pbargs[@]}]="-$i" ;; - - p) pbargs[${#pbargs[@]}]="-$i" - pbargs[${#pbargs[@]}]="$OPTARG" - # setting parent for user prompt below - parent="$OPTARG" ;; - - # -v doesn't get passed to putback. - v) verbatim='-v';; - - N) nolookup='-N';; - - *) fail "Invalid flag -$OPTARG. See 'wx help'"\ - "for more info.";; - esac - done - - if ! $narg; then - # real putback - - # get pb comments, will be used later. - if ! wx_summary -p $verbatim $nolookup >$wxtmp/pb_comments; then - # Fail if comments have problems. - fail "\nError, improper comments found. Use -v"\ - "to bypass this check." - fi - - if ! $force; then - # not force so give more warning. - ( # using subshell to capture stdout to file. - cat <<-EOF -Remember to run '$ME pbchk' before doing a final putback (esp. if -doing a putback to an official ON gate). Make sure your workspace -parent ($parent) is correct. -It's a good idea to check your code diffs before putback ('$ME pdiffs'). - -Also, run '$ME $command -n' and check for conflicts before doing the -final putback. - EOF - - if [[ -z "$(wx_summary -bo 2>/dev/null)" ]]; then - cat <<-EOF - -Don't forget the ARC ID info in your active list comments if there is an -ARC case associated with your putback. - EOF - fi - - echo "\nThe putback comment will be:" - cat $wxtmp/pb_comments - print "========== End of putback comments =======" - - # Output warning if RTI isn't approved. - wx_rtichk $nolookup - print "========== End of RTI check output =======" - - cat <<-EOF - -The following files will be used for putback: -$pbfiles - - EOF - ) | ${PAGER:-more} - - ok_to_proceed "Do you really want to"\ - "'$PUTBACK ${pbargs[@]}' to $parent?" - fi - fi - - # Do the putback, passing in active list comments if required. - # putback both active and renamed/deleted files. - cd $workspace - if $narg; then - # Don't use putback comment if -n is given (trial putback) - $PUTBACK "${pbargs[@]}" $pbfiles - else - # feed active list comments into real putback - wx_summary $verbatim $nolookup |$PUTBACK "${pbargs[@]}" $pbfiles - fi - return -} - -outchk() { - - # List files that are checked out but not in active list. - typeset outfile do_header=true - - wx_checked_out >/dev/null - # if $wxtmp/checked_out is 0 bytes then return - [[ -s $wxtmp/checked_out ]] || return - - sort $wxtmp/checked_out > $wxtmp/co_sort - wx_active | sort > $wxtmp/active_sort - for outfile in $(comm -12 $wxtmp/active_sort $wxtmp/co_sort); do - if $do_header; then - echo "\nWarning, the following active list files are"\ - "checked out:" - do_header=false - fi - echo "$outfile" - done - do_header=true - for outfile in $(comm -13 $wxtmp/active_sort $wxtmp/co_sort); do - if $do_header; then - cat <<-EOF - -Warning, the following files are checked out but not in active list -(Run "$ME update -q" to add them to the active list): - EOF - do_header=false - fi - echo "$outfile" - done - rm -f $wxtmp/co_sort $wxtmp/active_sort -} - -# -# run Teamware resolve and do reedit only on merged files. -# -wx_resolve() { - typeset merged_file - - # clear the file_list, will be set below - file_list= - - grep -v '^VERSION ' $wsdata/conflicts > $wxtmp/conflicts - [[ ! -f $wxtmp/conflicts ]] && fail "Error: cannot create $wxtmp/conflicts" - - # run Teamware resolve - resolve $* || fail "Teamware resolve failed." - - # resolve will remove files from $wsdata/conflicts when - # successfully merged. - - # set file_list to files that were merged. - for merged_file in $(cat $wxtmp/conflicts); do - if ! grep -q '^'"$(escape_re $merged_file)"'$' \ - $wsdata/conflicts; then - # set file_list for wx_eval later. - file_list="$file_list $merged_file" - fi - done - - if [[ -n $file_list ]]; then - ok_to_proceed "Re-edit merged files to collapse merge deltas?" - echo "Re-editing merged files" - echo - wx_eval wx_reedit_file - echo - echo "Re-edit complete" - echo - else - echo "No merged files to re-edit." - fi -} - -######################################################################### -# -# Main -# - -# -# Do some initial sanity checking and set up. -# - -# Set the lang to standard English so wx doesn't get confused. -export LC_ALL=C - -# Turn on debugging output early -if [[ "$*" == *' -D'*( *) ]]; then - typeset -ft $(typeset +f) - set -x -fi - -ME=$(basename $0) -export ME - -if [[ -d /usr/xpg4/bin ]]; then - # Want to use xpg4 versions of fgrep and grep - PATH=/usr/xpg4/bin:/usr/bin:/usr/sbin:/usr/ccs/bin:$PATH -else - fail "Error: directory /usr/xpg4/bin not found." -fi - -unset CDPATH # if set "cd" will print the new directory on stdout - # which screws up wx_eval. - -DEFAULT_SRCDIR=usr - -if [[ $# -eq 0 || "$1" == help ]]; then - # output usage now to avoid unnecessary checking below. - wx_usage -fi - -if [[ "$1" == version ]]; then - # output version now to avoid unnecessary checking below. - version - exit 0 -fi - -# -# Check to make sure we're not being run from within a Mercurial repo -# -if hg root >/dev/null 2>&1; then - fail "Error: wx does not support Mercurial repositories.\n"\ -"Please see http://opensolaris.org/os/community/tools/hg" -fi - -whence workspace >/dev/null || fail "Error: cannot find workspace command in \$PATH." - -# Note, PUTBACK can be set to "cm_env -g -o putback" to use Casper Dik's -# turbo-dir.flp scripts to speed up thorough updates. -PUTBACK=${PUTBACK:='putback'} -BRINGOVER=${BRINGOVER:='bringover'} - -dot=$PWD - -if [[ -n "$CODEMGR_WS" ]]; then - # ws was used. - # normalize the workspace name. - workspace=$(cd $CODEMGR_WS && workspace name) - - # If the current dir is in a workspace check that it is the same - # as CODEMGR_WS. - if [[ -n "$(workspace name)" ]]; then - if [[ "$(/bin/pwd)/" != "$workspace/"* ]]; then - cat <<-EOF - -Warning, $ME will use $ME files in workspace $workspace (the current -directory is not in this workspace). - EOF - ok_to_proceed "Okay to proceed?" - fi - fi -else - # If current dir is in a workspace then use output of workspace - # name as current ws. - workspace=$(workspace name) - if [[ -n "$workspace" ]]; then - CODEMGR_WS=$workspace - export CODEMGR_WS - fi -fi - -if [[ -z "$workspace" ]]; then - fail "No active workspace, run \"ws \" or"\ - "\"cd \"." -fi - -workspace_basename=`basename $workspace` -wxdir=${WXDIR:-$workspace/wx} -wxtmp=$wxdir/tmp -wsdata=$workspace/Codemgr_wsdata -node=`uname -n` - -if [ -f $wsdata/parent ]; then - parent=`tail -1 $wsdata/parent` -else - parent= -fi -if [[ $parent == *:* ]]; then - parentdir=${parent#*:} - parentnode=${parent%%:*} - if [[ $parentnode == $node ]]; then - parent=$parentdir - else - parent=/net/$parentnode$parentdir - fi -fi - -# Store backup state -backup_done=0 - -# store state if new files are deleted -NEED_WS_CLEAN='n' - -# XXX doing this because keywords doesn't work on new files -# Note doing the echo so the tabs are apparent, -# % is escaped to prevent keyword expansion by sccs commands on this file. -SCCSKEYWORD=$(echo "ident\t+\"(\%Z\%\%M\%\t+\%I\%|\%W\%)\t+\%E\% SMI\"") - -# file that contains comments for use in create and checkin -comment_file= -# mode for updating comments in active list -comment_mode="replace" - -CSTYLE_FLAGS=${CSTYLE_FLAGS:='-P -p -c'} -JSTYLE_FLAGS=${JSTYLE_FLAGS:='-p'} - -BACKUP_ERRORS=/tmp/${ME}_berrors_$(/usr/xpg4/bin/id -un)_$$ - -# global for reedit command, don't checkin by default -CHECKIN=false - -# Indicates that the parent nametable cache needs refreshing -need_pnt_refresh=true - -# Indicate whether file args were specified -FILES_PASSED=false - -# Used to store files that have more than one delta compared to parent -multi_delta_list= - -# Used to bringover any files just before exit of wx -bofilelist= - -# should codereviews include delta comments? -show_comments=true - -# Determines if active list should be sorted by default -# If sort_active contains true then we sort the active list on updates. -if [[ -r $wxdir/sort_active && "$(cat $wxdir/sort_active)" == "true" ]]; then - ACTSORT=sort -else - ACTSORT=cat -fi - -# These are set depending on what needs sorting -do_renamed_sort=false -do_active_sort=false - -# Places to search for approved RTIs -RTIDIRS="/net/wizard.eng/export/consolidation/rtiroute/newrtis - /net/wizard.eng/export/consolidation/rtiroute/oldrtis - /net/onstc.eng/export/stc/Rtitool/consolidation/rtiroute/newrtis - /net/onstc.eng/export/stc/Rtitool/consolidation/rtiroute/oldrtis" - -# Places to search for approved Patch RTIs -PRTIDIRS="/net/wizard.eng/export/consolidation/rtiroute/newprtis - /net/wizard.eng/export/consolidation/rtiroute/oldprtis" - -export workspace parent wxdir file dir filepath backup_done DEFAULT_SRCDIR - -# -# main section -# - -# Get wx command -command=$1 -comlist=$command -shift -# throw away -D flag after command assigned as this flag was processed earlier -[[ "$1" == '-D' ]] && shift - -case $command in - apply|eval) subcommand=$1; shift;; - grep|egrep|sed|nawk) pattern=$1; shift;; - nits) comlist="cstyle jstyle hdrchk copyright cddlchk keywords"; - echo "Note, nits is a subset of pbchk checks.";; - pbchk) comlist="cstyle jstyle hdrchk copyright cddlchk keywords" - comlist="$comlist rmdelchk deltachk comchk rtichk outchk";; -esac - -orig_args="$@" -silent= -args= -file_list= -typeset tmp_file_list tmp_args - -# -# Some subcommands pass through all arguments. -# -case $command in - webrev) args="$orig_args"; shift $#;; -esac - -# Parse args -while [ $# -gt 0 ]; do - case $1 in - -c|-C) - if [[ $command == @(delget|checkin|ci|create) ]]; then - # set global comment_file - [[ "$1" == "-C" ]] && comment_mode="append" - comment_file=$2; - if [[ $comment_file != '/'* ]]; then - comment_file="$(pwd)/$comment_file" - fi - if [[ -z "$comment_file" ]]; then - fail "Missing comment file."\ - "Run 'wx help' for info." - fi - [[ ! -r "$comment_file" ]] && - fail "Can not read comment file"\ - "$comment_file." - echo "Using comment file $comment_file"\ - "for comments." - # shift past the comment_file arg - shift - elif [[ $1 == '-C' && $command == 'diffs' || - $command == 'tdiffs' && - -z $WXDIFFCMD ]]; then - if [[ $2 != +([0-9]) ]]; then - # provide default context value for - # compat with old wx - args="$args -C5" - else - args="$args -C$2" - # shift past context lines arg - shift - fi - else - args="$args $1" - fi;; - -p) if [[ $command == @(putback|pb) ]]; then - if workspace access $2 >/dev/null; then - # 2nd arg is a workspace - args="$args $1 $2" - else - fail "$2 not a workspace."\ - "Run 'wx help' for info." - fi - # shift past the parent ws arg - shift - else - # for other commands -p doesn't have a arg - args="$args $1" - fi;; - -r) if [[ $command == @(get|extract) ]]; then - # 2nd arg is the version # - args="$args $1 $2" - # shift past 2nd arg - shift - else - # for other commands -r doesn't have a arg - args="$args $1" - fi;; - -s) if [[ "$command" == @(update|init) ]]; then - args="$args $1" - else - silent=-s - fi;; - -N) if [[ "$command" == @(codereview|fullreview) ]]; then - show_comments=false - else - args="$args $1" - fi ;; - -*) args="$args $1";; - *) if [[ -z "$file_list" ]]; then - file_list="$1" - else - file_list="$file_list $1" - fi;; - esac - shift -done - -if [[ "$command" == "init" ]]; then - if [ -z "$file_list" ]; then - file_list=$DEFAULT_SRCDIR - fi - wx_init $file_list $args - exit -fi - -if [ ! -d $wxdir/tmp ]; then - echo "Workspace does not appear to be initialized for $ME." - echo "The initialization process will create a few files under" - echo "$wxdir but will not otherwise affect your workspace." - ok_to_proceed 'OK to proceed?' - - ask "Where is the root of the source code in this workspace?" \ - $DEFAULT_SRCDIR - # wx_init modifies file_list so save current value - tmp_file_list=$file_list - file_list= - # save off args and set to null to avoid side effects - tmp_args=$args - args= - wx_init $answer - # restore original file list and cd to original dir in case there's - # a command to execute. - file_list=$tmp_file_list - args=$tmp_args - cd $dot -fi - -if [[ ! -f $wxdir/local_nametable ]]; then - touch $wxdir/local_nametable -fi - -# Doing this for backward compat since old wx doesn't have a renamed list -if [[ ! -f $wxdir/renamed ]]; then - # if 'wx update' or 'wx update -r' is the command then skip - # renamed list creation since it will happen anyway. - if [[ "$command" != "update" ]] || [[ "$args" == *'-q'* ]]; then - ring_bell - cat <<-EOF - -$ME needs to create a renamed file list. If you are sure that no files -were renamed or deleted in the current workspace then answer no to the -following question. - - EOF - yesno "Okay to search for renamed files (can be slow)?" - if [[ "$answer" == "yes" ]] - then - wx_update -r - else - touch $wxdir/renamed - fi - fi -fi - -# Doing this for backward compat since old wx doesn't have a new list -if [[ ! -f $wxdir/new ]]; then - ring_bell - cat <<-EOF - -$ME needs to create a new-file list (cache names of newly created -files). Please be patient. - EOF - # Avoid a putback -n which is slow, just use lookup_parent() - touch $wxdir/new || fail "Error: cannot create $wxdir/new list" - wx_active | - while read filepath; do - if ! lookup_parent $filepath; then - add_new $filepath - fi - done - echo "\nNew files:" - cat $wxdir/new - echo -fi - -if [[ "$command" == @(restore|backup|bu) ]]; then - # If the backup dir was specified as a file arg... - if [ -n "$file_list" ]; then - backup_dir=$(echo "$file_list"|cut -f1 -d' ') - fi - # unset file_list since this file arg has been processed here. - unset file_list -elif [[ "$command" == "ea" ]]; then - # Do this command before wx_active is run because the active list - # may be corrupt. - cd $wxdir - exec ${EDITOR-vi} active -elif [[ "$command" == @(unedit|uncheckout|unco) ]]; then - if [[ -z "$file_list" && $args != *-f ]]; then - echo "$ME will $command all active files which may remove"\ - "them from the active list." - ok_to_proceed 'Do you REALLY want to do this?' - fi - cp $wxdir/active $wxdir/active.old -elif [[ "$command" == @(bugs|arcs) ]]; then - # -v verbatim is not valid for these commands - if [[ "$args" == *'-v'* ]]; then - fail "Invalid flag -v. Run 'wx help' for info." - fi -elif [[ "$command" == "create" ]]; then - if [ -z "$file_list" ]; then - fail "$command missing file arg(s). Run 'wx help' for info." - fi - - cp $wxdir/active $wxdir/active.old || - fail "Error could not backup $wxdir/active" -elif [[ "$command" == @(delget|checkin|ci) && -n "$comment_file" ]]; then - cp $wxdir/active $wxdir/active.old || - fail "Error could not backup $wxdir/active" -elif [[ "$command" == @(mv) ]]; then - if [[ $(echo "$file_list"|wc -w) -ne 2 ]]; then - fail "$command requires two args. Run 'wx help' for info." - fi - - cp $wxdir/active $wxdir/active.old || - fail "Error could not backup $wxdir/active" - cp $wxdir/renamed $wxdir/renamed.old || - fail "Error could not backup $wxdir/renamed" -elif [[ "$command" == @(delete|rm) ]]; then - - if [ -z "$file_list" ]; then - echo "$ME will try to delete all active files which may "\ - "remove them from the active list." - ok_to_proceed 'Do you REALLY want to do this?' - fi - - cp $wxdir/active $wxdir/active.old || - fail "Error: could not backup $wxdir/active" - cp $wxdir/renamed $wxdir/renamed.old || - fail "Error: could not backup $wxdir/renamed" -elif [[ "$command" == reset ]]; then - cp $wsdata/nametable $wxtmp/nametable.orig || \ - fail "Error: cp $wsdata/nametable $wxtmp/nametable.orig failed." -fi - -if [ -z "$file_list" ]; then - basedir=$workspace - file_list=$(wx_active) || fail -else - base_file_list=$file_list - file_list= - for basefile in $base_file_list; do - # normalize the filepaths - if [[ -d $basefile ]]; then - basedir=$(cd $basefile && /bin/pwd) - abspath=$basedir - else - basedir=$(cd $(dirname $basefile) && /bin/pwd) - abspath=$basedir/$(basename $basefile) - fi - if [[ ! -d $basedir ]]; then - fail "Error: Path to $basefile does not exist." - elif [[ $(cd $basedir; workspace name) != $workspace ]]; then - fail "Error: $basefile isn't in current workspace: $workspace." - - fi - filepath=${abspath##$workspace/} - if [[ -z "$file_list" ]]; then - file_list="$filepath" - else - file_list="$file_list $filepath" - fi - done - FILES_PASSED=true -fi - -if [[ "$command" == @(nits|pbchk) ]]; then - tmp_list= - # skip nits/pbchk checks for files listed in $command.NOT - if [[ -f $wxdir/${command}.NOT ]]; then - for _a_file in $file_list; do - if grep -q "^$(escape_re $_a_file)$" \ - $wxdir/${command}.NOT - then - echo "skipping $command checks for "\ - "$_a_file (skipping)" - else - tmp_list="$tmp_list $_a_file" - fi - done - file_list=${tmp_list# } - fi - [[ -z $file_list ]] && exit 0 -fi - -# This is where the commands are executed. -for command in $comlist; do -cd $dot -case $command in - list|active) wx_active $args ;; - pblist) wx_active -p;; - renamed) list_renamed $args ;; - new) list_new $args;; - update) wx_update $args;; - out) wx_checked_out; cat $wxtmp/checked_out;; - diffs) wx_eval -r 'print -- "\n------- $filepath -------\n"; - sccs get -s -p -k $filepath | - ${WXDIFFCMD:-diff} $args - $filepath';; - tdiffs) ## As diffs but also shows new files. - if [[ -r $wxdir/new ]]; then - ## Read names of new files into space separated list. - while read new_file - do - new_files="${new_files}${new_file} " - done < $wxdir/new - else - new_files="" - fi - ## For new files a comparison is made with /dev/null thus - ## all lines will appear to have been added. - wx_eval -r 'print -- "\n------- $filepath -------\n"; - if [[ ${new_files} == *"${filepath} "* ]]; then - ${WXDIFFCMD:-diff} $args /dev/null $filepath; - else - sccs get -s -p -k $filepath | - ${WXDIFFCMD:-diff} $args - $filepath; - fi';; - pdiffs|tpdiffs) - ## Parent Diffs - Compare with parent file. For - ## 'tpdiffs' when the parent file does not exist the - ## child file is assumed new and compared to - ## /dev/null; thus all lines will appear to have been - ## added. - wx_eval ' - print -- "\n------- $filepath -------\n"; - if wx_pnt_filepath; then - echo "Index: $filepath"; - ${WXDIFFCMD:-diff} $args $parentfilepath - $workspace/$filepath; - elif [[ $command == 'tpdiffs' ]]; then - ${WXDIFFCMD:-diff} $args /dev/null - $workspace/$filepath; - else - print "New file (does not exist in parent)."; - fi';; - pvi) wx_eval ' - echo $filepath; - if wx_pnt_filepath; then - ${EDITOR-vi} $args $parentfilepath; - else - echo "New file (does not exist in parent)"; - fi';; - edit|checkout|co) wx_eval wx_edit;; - unedit|uncheckout|unco) wx_eval wx_unedit;; - create) wx_eval wx_create $args;; - uncreate) wx_eval wx_uncreate $args;; - delete|rm) wx_eval wx_delete $args;; - mv) wx_mv $file_list;; - delget|checkin|ci) wx_eval wx_delget $args;; - get|extract) wx_eval wx_get;; - reset) wx_eval wx_reset $args;; - putback|pb) wx_putback $args;; - resolve) wx_resolve $args;; - prt) wx_eval 'sccs prt $args $file';; - comments) wx_eval 'echo $filepath; echo; wx_show_comment; echo';; - bugs) wx_summary -ao $args;; - arcs) wx_summary -bo $args;; - pbcom) wx_summary -po $args;; - info) wx_eval wx_info;; - reedit|recheckout|reco) wx_reedit $args;; - redelget|recheckin|reci) CHECKIN=true; wx_reedit $args;; - cstyle) echo "\nDoing cstyle check:" - rm -f $wxtmp/wx.cstyle.*; - export CSTYLE_INDEX=0; - wx_eval wx_cstyle; - wait; - sort -k 1,1 -k 2,2n $wxtmp/wx.cstyle.* 2> /dev/null - ;; - jstyle) echo "\nDoing jstyle check:" - rm -f $wxtmp/wx.jstyle.*; - export JSTYLE_INDEX=0; - wx_eval wx_jstyle; - wait; - sort -k 1,1 -k 2,2n $wxtmp/wx.jstyle.* 2> /dev/null - ;; - hdrchk) echo "\nDoing header format check:"; - cd $workspace; - hdrchk_files=; - for filepath in $file_list ; do - if [[ "$filepath" == *.h ]]; then - if [[ -s $wxdir/${command}.NOT ]] && - grep -q "^$(escape_re $filepath)$" \ - $wxdir/${command}.NOT - then - echo "$filepath (skipping)" - else - hdrchk_files="$hdrchk_files $filepath" - fi - fi - done - hdrchk -a $args $hdrchk_files ;; - makestyle) echo "\nDoing makestyle check:"; - cd $workspace; mlist=$(wx_active | grep '[Mm]akefile'); - [[ -n "$mlist" ]] && makestyle $args $mlist;; - - keywords) - echo "\nDoing keywords check:"; - cd $workspace; - keyword_files=; - for filepath in $file_list ; do - if [[ -s $wxdir/${command}.NOT ]] && - grep -q "^$(escape_re $filepath)$" \ - $wxdir/${command}.NOT - then - echo "$filepath (skipping)" - else - keyword_files="$keyword_files $filepath" - fi - done - keywords -p $args $keyword_files;; - - rmdelchk) echo "\nDoing sccs rmdel check:"; wx_eval rmdelchk;; - - rtichk) wx_rtichk;; - - deltachk) echo "\nDoing multi delta check:"; wx_eval deltachk;; - copyright) echo "\nDoing copyright check:"; - cd $workspace; - copyright_files=; - for filepath in $file_list; do - if [[ -s $wxdir/${command}.NOT ]] && - grep -q "^$(escape_re $filepath)$" \ - $wxdir/${command}.NOT - then - echo "$filepath (skipping)" - else - copyright_files="$copyright_files $filepath" - fi - done - copyrightchk $copyright_files;; - - cddlchk) - echo "\nDoing CDDL block check:"; - cd $workspace; - cddlnot=""; - if [[ -s $wxdir/${command}.NOT ]]; then - cddlnot="-x $wxdir/${command}.NOT" - fi - - # - # Split the file list into new files and existing files. - # New files must have a CDDL block whereas existing files don't - # necessarily have to have a block, but if they do it must be - # valid. Both sets of files are subject to cddlchk.NOT - # exception processing. - # - old="" - new="" - for filepath in $file_list; do - if wx_pnt_filepath $filepath; then - old="$old $filepath" - else - new="$new $filepath" - fi - done - [[ ! -z $new ]] && cddlchk $cddlnot $args -a $new - [[ ! -z $old ]] && cddlchk $cddlnot $args $old - ;; - comchk) echo "\nDoing comments check:"; wx_summary -n 2>&1;; - outchk) echo "\nDoing out check:"; outchk;; - backup|bu) wx_backup $args;; - restore) wx_restore $args;; - apply) wx_eval "$subcommand \$file";; - eval) wx_eval "$subcommand";; - grep|egrep) - wx_eval ' - if egrep -s '\'$pattern\'' $file; - then - echo $filepath; - $command $args '\'$pattern\'' $file; - fi';; - nawk|sed) - wx_eval 'echo $filepath; $command $args '\'$pattern\'' $file';; - codereview) args="-e $args"; wx_eval wx_fullreview;; - fullreview) wx_eval wx_fullreview;; - webrev) wx_webrev $args;; - dir) echo $wxdir;; - e) cd $wxdir; exec ${EDITOR-vi} $orig_args;; - ws) cd $wsdata; cat $orig_args;; - args) cat $wsdata/args;; - access) cat $wsdata/access_control;; - *) ring_bell; - echo "Command not found. Run 'wx help' for command list."; - exit 1;; -esac - -done - -if [[ $NEED_WS_CLEAN == 'y' ]]; then - # clean up the nametable - print -u2 "Running workspace updatenames to clean up nametable, may"\ - "take a while." - workspace updatenames >&2 -fi - -if [[ -n $bofilelist ]]; then - $BRINGOVER $bofilelist -fi - -# save sorting for last for some speed up. -if [[ $ACTSORT == sort ]]; then - if $do_renamed_sort; then - sort_renamed - fi - if $do_active_sort; then - sort_active - fi -fi diff --git a/usr/src/tools/scripts/wx2hg.sh b/usr/src/tools/scripts/wx2hg.sh deleted file mode 100644 index aa756aed23..0000000000 --- a/usr/src/tools/scripts/wx2hg.sh +++ /dev/null @@ -1,412 +0,0 @@ -#! /usr/bin/ksh -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# - -# -# Copyright 2009 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# - -# -# Convert a wx-based workspace to Mercurial. -# - -usage="wx2hg [-u] [-r hg_rev] [-t hg_ws] codemgr_ws" - -# -# If "yes", then give some hints about cleanup and rerunning after a -# failure. -# -can_retry=no -tail=/usr/xpg4/bin/tail - -function has_hg_twin { - [[ -n "$primary_twin" ]] -} - -function warn { - print -u2 wx2hg: warning: "$@" -} - -function note { - print -u2 wx2hg: note: "$@" -} - -function fail { - print -u2 wx2hg: "$@" - if [[ "$can_retry" = yes ]]; then - print -u2 "Please run" - print -u2 " hg --cwd $hg_ws update -C" - print -u2 "before retrying." - fi - exit 1 -} - -function clone_twins { - ws="$1" - rev="$2" - - echo "Cloning $primary_twin" - echo "to $ws" - set -x - hg clone -r $rev "$primary_twin" "$ws" - set +x - - rev_warning=n - for dir in $nested_twins; do - echo "Cloning from $primary_twin/$dir" - echo "to $ws/$dir" - mkdir -p $ws/$dir - set -x - hg init $ws/$dir - echo "[paths]" > $ws/$dir/.hg/hgrc - echo "default=$primary_twin/$dir" >> $ws/$dir/.hg/hgrc - ( cd $ws/$dir; hg pull -u -r $rev "$primary_twin"/$dir ) - if (( $? != 0 )); then - warn "Unable to clone $primary_twin/$dir" - rev_warning=y - fi - set +x - done - - [[ $rev_warning = "n" ]] || fail \ -"revision $rev was not present in all workspaces.\n" \ -"When using -r with nested repositories, you should specify a tag\n" \ -"name that is valid in each workspace." -} - -# -# Command-line processing, sanity checks, and setup. -# - -[[ -n $(whence workspace) ]] || - fail "workspace command not found; please check PATH." - -# do a wx update? -do_update=yes - -# -# Mercurial workspace to populate. Default is to create, in the same -# directory as the Teamware workspace, a new Mercurial workspace cloned -# from the hg_twin of the Teamware parent. -# -hg_ws="" - -# -# Revision in the Mercurial workspace to apply the changes to. -# Default is to get the most recent revision (tip), thus avoiding -# the need for a merge unless overridden by the caller using -r. -# -hg_rev="tip" - -while getopts r:t:u opt; do - case $opt in - r) hg_rev="$OPTARG";; - t) hg_ws="$OPTARG";; - u) do_update=no;; - ?) print -u2 "usage: $usage"; exit 1;; - esac -done -shift $(($OPTIND - 1)) - -if [[ $# -ne 1 ]]; then - print -u2 "usage: $usage" - exit 1 -fi - -CODEMGR_WS="$1" -[[ "$CODEMGR_WS" = /* ]] || CODEMGR_WS="$(pwd)/$CODEMGR_WS" -export CODEMGR_WS - -if [[ -n "$hg_ws" ]]; then - if [[ ! -d "$hg_ws" || ! -d "$hg_ws/.hg" ]]; then - fail "$hg_ws is not a Mercurial workspace." - fi - [[ "$hg_ws" = /* ]] || hg_ws="$(pwd)/$hg_ws" -fi - -[[ -d "$CODEMGR_WS" ]] || fail "$CODEMGR_WS does not exist." -cd "$CODEMGR_WS" - -codemgr_parent=$(workspace parent) -[[ -n "$codemgr_parent" ]] || \ - fail "$CODEMGR_WS is not a Teamware workspace or does not have a parent." -[[ -d "$codemgr_parent" ]] || fail "parent ($codemgr_parent) doesn't exist." - -primary_twin="" -nested_twins="" -twinfile="$codemgr_parent"/Codemgr_wsdata/hg_twin -if [[ -f $twinfile ]]; then - primary_twin=$(head -1 $twinfile) - nested_twins=$($tail -n +2 $twinfile | sort -r) -fi - -if has_hg_twin; then - echo "Teamware parent $codemgr_parent has twin $primary_twin" - [[ -n "$nested_twins" ]] && - echo "and nested twins $nested_twins" -fi - -# -# Do this check before time-consuming operations like creating -# the target repo. -# -his=$(find Codemgr_wsdata -name history -mtime -1) -if [[ -z "$his" ]]; then - warn "history file is more than one day old; do you need to" \ - "bringover from $codemgr_parent?" -fi - -# Less time-consuming than cloning - -if [[ ! -d wx ]]; then - print "Initializing wx..." - wx init -ft -else - if [[ "$do_update" = yes ]]; then - print "Updating wx state..." - wx update - fi -fi - -wx outchk - -out_files=$(wx out) -active_files=$(wx list) - -if [[ ! -z "$out_files" ]]; then - fail "wx2hg will only migrate checked-in files;" \ - "please check in these files with wx ci and try again" -fi - -# more time-consuming than wx update and wx outchk - -if [[ -z "$hg_ws" ]]; then - ws=$(basename $(pwd)) - hg_ws=$(dirname $(pwd))/"$ws-hg" -fi - -if [[ -d "$hg_ws" ]]; then - echo "Updating preexisting Mercurial workspace $hg_ws to $hg_rev\n" - (cd "$hg_ws"; hg update -C $hg_rev) || - fail "hg update $hg_rev failed for $hg_ws" - if [[ -n "$nested_twins" ]]; then - update_warning=n - for dir in $nested_twins; do - if [[ ! -d "$hg_ws/$dir" ]]; then - warn "$hw_ws/$dir does not exist" - update_warning=y - fi - echo "Updating preexisting nested workspace " \ - "$hg_ws/$dir to $hg_rev\n" - (cd "$hg_ws"/$dir ; hg update -C $hg_rev) - if (( $? != 0 )); then - warn "hg update $hg_rev failed for $hg_ws/$dir" - update_warning=y - continue - fi - done - - [[ $update_warning = "n" ]] || - fail "When using an existing Mercurial workspace with\n" \ - "nested repositories, all nested repositories must\n" \ - "already exist in the existing workspace. If also\n" \ - "specifying -r, then the specified hg_rev must be\n" \ - "valid in all nested repositories." - fi -else - if has_hg_twin; then - clone_twins "$hg_ws" $hg_rev - else - fail "$codemgr_parent is not recognized as a gate;" \ - "please provide a Mercurial workspace (-t hg_ws)" \ - "that matches it." - fi -fi - -can_retry=yes - -# Make sure hg_ws is an absolute path -[[ "$hg_ws" = /* ]] || hg_ws="$(pwd)/$hg_ws" - - -# usage: which_repo filename -function which_repo { - typeset f=$1 - - for r in $nested_twins; do - if [ ${f##$r/} != $f ]; then - echo ${f##$r/} $r - return - fi - done - - echo $f "." -} - -# -# Do renames first, because they'll be listed with the new name by "wx -# list". There's a conflict if the new name already exists or if the -# old name does not exist. We can theoretically recover from the -# former (move the existing file out of the way, or pick a different -# new name), but not the latter. For now, just error out and let the -# user fix up the workspace so that there isn't a conflict. -# - -renamelist=/tmp/wxrename$$ -wx renamed > "$renamelist" - -# usage: do_rename oldname newname -function do_rename { - typeset old_file old_repo new_file new_repo - - which_repo $1 | read old_file old_repo - which_repo $2 | read new_file new_repo - - typeset old=$old_repo/$old_file - typeset new=$new_repo/$new_file - - [[ -f "$old" ]] || fail "can't rename: $old doesn't exist." - [[ ! -f "$new" ]] || fail "can't rename: $new already exists." - - dir=$(dirname "$new") - base=$(basename "$new") - [[ -d "$dir" ]] || mkdir -p "$dir" || fail "mkdir failed" - - if [ $old_repo = $new_repo ]; then - print "rename $old -> $new" - set -x - ( cd $old_repo; hg mv $old_file $new_file ) || \ - fail "rename failed." - set +x - else - print "moving $old_file from repository $old_repo" - print "to $new_file in repository $new_repo" - cp $old $new - set -x - ( cd $old_repo; hg rm $old_file ) || fail "hg rm failed" - ( cd $new_repo; hg add $new_file ) || fail "hg add failed" - set +x - fi -} - -if [[ -s "$renamelist" ]]; then - cat "$renamelist" | ( - cd "$hg_ws" - while :; do - read newname oldname - [[ -n "$newname" ]] || break - do_rename "$oldname" "$newname" - done - ) || exit 1 -fi - -# -# usage: name_in_parent fname -# If fname had been renamed, echo the old name. Otherwise echo the -# given name. -# -function name_in_parent { - typeset new old - - if [[ -s "$renamelist" ]]; then - cat "$renamelist" | while :; do - read new old - [[ -n "$new" ]] || break - if [[ "$1" = "$new" ]]; then - print "$old" - return - fi - done - fi - print "$1" -} - -# -# Now do content changes. There's a likely conflict if the file in -# Mercurial is different from the file in the Teamware parent. -# - -parentfile=/tmp/parent$$ -patchfile=/tmp/patch$$ -childfile=/tmp/child$$ - -[[ -n "$active_files" ]] || warn "no files in active list." - -for f in $active_files; do - # - # Get the name that the file appears in the parent as. - # - oldname=$(name_in_parent "$f") - - # We need unexpanded SCCS keywords for both parent and child - sccs get -skp "$f" > "$childfile" - - if [[ -f "$codemgr_parent/$oldname" ]]; then - (cd $codemgr_parent; sccs get -skp "$oldname" > "$parentfile") - else - rm -f $parentfile - fi - - if [[ ! -r "$parentfile" ]]; then - print "new file: $f" - [[ ! -f "$hg_ws/$f" ]] || fail "$f already exists in $hg_ws." - dir=$(dirname "$hg_ws/$f") - base=$(basename "$hg_ws/$f") - [[ -d "$dir" ]] || mkdir -p "$dir" || fail "mkdir failed" - cp "$childfile" "$hg_ws/$f" || fail "copy failed" - set -x - (cd "$dir" && hg add "$base") || fail "hg add failed." - set +x - elif diff "$parentfile" "$hg_ws/$f" > /dev/null 2>&1; then - if diff -u "$parentfile" "$childfile" > "$patchfile"; then - print "skipping $f (unchanged)." - continue - fi - (cd "$hg_ws"; gpatch -F0 $f < "$patchfile") - [[ $? -eq 0 ]] || fail "$f: patch failed." - else - diff -u "$parentfile" "$hg_ws/$f" - echo "" - - fail "For file:\n\n\t$f\n\nthe teamware parent:" \ - "\n\n\t$codemgr_parent" \ - "\n\ndoesn't match its mercurial twin;" \ - "specify the matching revision in mercurial\nwith" \ - "-r hg_rev, or resynchronize them.\n" - fi -done - -note "remember to commit your changes:" -echo "in primary repository ${hg_ws}:" -( cd $hg_ws ; hg status -mard ) -for n in $nested_twins; do - echo "in nested repository ${n}:" - ( cd $hg_ws/$n ; hg status -mard ) -done - -if [[ "$hg_rev" != "tip" ]]; then - note "before you integrate your changes, $hg_ws must be merged to tip" -fi - -rm -f "$parentfile" "$patchfile" "$renamelist" "$childfile" - -exit 0 -- 2.11.4.GIT