diff --git a/ietf/__init__.py b/ietf/__init__.py index 43630b107..7dc5cc30f 100644 --- a/ietf/__init__.py +++ b/ietf/__init__.py @@ -1,9 +1,9 @@ # Copyright The IETF Trust 2007, All Rights Reserved -__version__ = "2.01-dev" +__version__ = "2.xx-trunk" __date__ = "$Date$" -__rev__ = "$Rev:$ (dev) Latest release: Rev. 726 " +__rev__ = "$Rev$ (dev) Latest release: Rev. 838 " __id__ = "$Id$" diff --git a/ietf/bin/pretty-xml-dump b/ietf/bin/pretty-xml-dump new file mode 100755 index 000000000..22abc08a6 --- /dev/null +++ b/ietf/bin/pretty-xml-dump @@ -0,0 +1,5 @@ +#!/bin/sh +python manage.py dumpdata --format=xml "$@" | sed -e 's/<\/*object/\ + &/g' -e 's/\d+)/$', views.wgdocs), - (r'^wg/(?P[^/]+)/$', views.wgdocs), + (r'^wgid/(?P\d+)/$', views.wgdocs_redir), + (r'^wg/(?P[^/]+)/$', views.wgdocs), (r'^ind/(?P[^/]+)/$', views.inddocs), (r'^other/(?P[^/]+)/$', views.otherdocs), # (?P(?:all|rfc|current|dead)) really confuses reverse() @@ -24,10 +24,10 @@ urlpatterns = patterns('', (r'^(?Prfc)/$', views.showdocs), (r'^(?Pcurrent)/$', views.showdocs), (r'^(?Pdead)/$', views.showdocs), - (r'^(?P\d+)/related/$', views.view_related_docs), + (r'^(?P\d+)/related/$', views.redirect_related), (r'^(?P[^/]+)/related/$', views.view_related_docs), - (r'^(?P\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict), - (r'^(?P[^/]+)/$', 'django.views.generic.list_detail.object_detail', dict(info_dict, slug_field='filename')), + (r'^(?P\d+)/$', views.redirect_id), + (r'^(?P[^/]+)/$', views.view_id, dict(info_dict, slug_field='filename')), (r'^all_id_txt.html$', views.all_id, { 'template_name': 'idindex/all_id_txt.html' }), (r'^all_id.html$', views.all_id, { 'template_name': 'idindex/all_id.html' }), (r'^$', views.search), diff --git a/ietf/idindex/views.py b/ietf/idindex/views.py index fa5ffb78d..6b689ac74 100644 --- a/ietf/idindex/views.py +++ b/ietf/idindex/views.py @@ -1,38 +1,41 @@ # Copyright The IETF Trust 2007, All Rights Reserved -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponsePermanentRedirect from django.views.generic.list_detail import object_list from django.db.models import Q from django.http import Http404 from django.template import RequestContext, loader from django.shortcuts import render_to_response, get_object_or_404 +from django.core.urlresolvers import reverse +from django.views.generic.list_detail import object_detail from ietf.idtracker.models import Acronym, IETFWG, InternetDraft, Rfc from ietf.idindex.forms import IDIndexSearchForm from ietf.idindex.models import alphabet, orgs, orgs_dict -from ietf.utils import orl, flattenl +from ietf.utils import orl, flattenl, normalize_draftname base_extra = { 'alphabet': alphabet, 'orgs': orgs } -def wgdocs(request, **kwargs): - if kwargs.has_key('id'): - queryset = InternetDraft.objects.filter(group=kwargs['id']) - group = get_object_or_404(Acronym, acronym_id=kwargs['id']) - else: - wg = kwargs['slug'] - try: - group = Acronym.objects.get(acronym=wg) - except Acronym.DoesNotExist: # try a search - if wg == 'other': - queryset = IETFWG.objects.filter( - orl([Q(group_acronym__acronym__istartswith="%d" % i) for i in range(0,10)]) - ) - else: - queryset = IETFWG.objects.filter(group_acronym__acronym__istartswith=wg) - queryset = queryset.filter(group_type__type='WG').select_related().order_by('status_id', 'acronym.acronym') - return object_list(request, queryset=queryset, template_name='idindex/wglist.html', allow_empty=True, extra_context=base_extra) - queryset = InternetDraft.objects.filter(group__acronym=wg) +def wgdocs_redir(request, id): + group = get_object_or_404(Acronym, acronym_id=id) + return HttpResponsePermanentRedirect(reverse(wgdocs, args=[group.acronym])) + +def wgdocs(request, wg): + try: + group = Acronym.objects.get(acronym=wg) + except Acronym.DoesNotExist: # try a search + if wg == 'other': + queryset = IETFWG.objects.filter( + orl([Q(group_acronym__acronym__istartswith="%d" % i) for i in range(0,10)]) + ) + else: + queryset = IETFWG.objects.filter(group_acronym__acronym__istartswith=wg) + queryset = queryset.filter(group_type__type='WG').select_related().order_by('status_id', 'acronym.acronym') + extra = base_extra.copy() + extra['search'] = wg + return object_list(request, queryset=queryset, template_name='idindex/wglist.html', allow_empty=True, extra_context=extra) + queryset = InternetDraft.objects.filter(group__acronym=wg) queryset = queryset.order_by('status_id', 'filename') - extra = base_extra + extra = base_extra.copy() extra['group'] = group return object_list(request, queryset=queryset, template_name='idindex/wgdocs.html', allow_empty=True, extra_context=extra) @@ -47,7 +50,7 @@ def inddocs(request, filter=None): else: queryset = InternetDraft.objects.filter(filename__istartswith='draft-' + filter) queryset = queryset.exclude(ind_exception).filter(group__acronym='none').order_by('filename') - extra = base_extra + extra = base_extra.copy() extra['filter'] = filter return object_list(request, queryset=queryset, template_name='idindex/inddocs.html', allow_empty=True, extra_context=extra) @@ -61,7 +64,7 @@ def otherdocs(request, cat=None): Q(filename__istartswith="draft-ietf-%s-" % p) for p in org.get('prefixes', [ org['key'] ])])) queryset = queryset.order_by('status_id','filename') - extra = base_extra + extra = base_extra.copy() extra['category'] = cat return object_list(request, queryset=queryset, template_name='idindex/otherdocs.html', allow_empty=True, extra_context=extra) @@ -98,6 +101,9 @@ def showdocs(request, cat=None): def search(request): + args = request.GET.copy() + if args.has_key('filename'): + args['filename'] = normalize_draftname(args['filename']) form = IDIndexSearchForm() t = loader.get_template('idindex/search.html') # if there's a query, do the search and supply results to the template @@ -110,20 +116,20 @@ def search(request): 'first_name': 'authors__person__first_name__icontains', } for key in qdict.keys() + ['other_group']: - if key in request.REQUEST: + if key in args: searching = True if searching: # '0' and '-1' are flag values for "any" # in the original .cgi search page. # They are compared as strings because the # query dict is always strings. - q_objs = [Q(**{qdict[k]: request.REQUEST[k]}) + q_objs = [Q(**{qdict[k]: args[k]}) for k in qdict.keys() - if request.REQUEST.get(k, '') != '' and - request.REQUEST[k] != '0' and - request.REQUEST[k] != '-1'] + if args.get(k, '') != '' and + args[k] != '0' and + args[k] != '-1'] try: - other = orgs_dict[request.REQUEST['other_group']] + other = orgs_dict[args['other_group']] q_objs += [orl( [Q(filename__istartswith="draft-%s-" % p)| Q(filename__istartswith="draft-ietf-%s-" % p) @@ -212,13 +218,25 @@ def related_docs(startdoc): process(startdoc, (0,0,0)) return related -def view_related_docs(request, **kwargs): - if kwargs.has_key('id'): - startdoc = get_object_or_404(InternetDraft, id_document_tag=kwargs['id']) - else: - startdoc = get_object_or_404(InternetDraft, filename=kwargs['slug']) +def redirect_related(request, id): + doc = get_object_or_404(InternetDraft, id_document_tag=id) + return HttpResponsePermanentRedirect(reverse(view_related_docs, args=[doc.filename])) + +def view_related_docs(request, slug): + startdoc = get_object_or_404(InternetDraft, filename=slug) related = related_docs(startdoc) - context = {'related': related, 'numdocs': len(related)} + context = {'related': related, 'numdocs': len(related), 'startdoc': startdoc} context.update(base_extra) return render_to_response("idindex/view_related_docs.html", context, context_instance=RequestContext(request)) + +def redirect_id(request, object_id): + '''Redirect from historical document ID to preferred filename url.''' + doc = get_object_or_404(InternetDraft, id_document_tag=object_id) + return HttpResponsePermanentRedirect(reverse(view_id, args=[doc.filename])) + +# Wrapper around object_detail to give permalink a handle. +# The named-URLs feature in django 0.97 will eliminate the +# need for these. +def view_id(*args, **kwargs): + return object_detail(*args, **kwargs) diff --git a/ietf/idtracker/feeds.py b/ietf/idtracker/feeds.py index 5a1969905..50be67039 100644 --- a/ietf/idtracker/feeds.py +++ b/ietf/idtracker/feeds.py @@ -1,29 +1,35 @@ # Copyright The IETF Trust 2007, All Rights Reserved -from django.contrib.syndication.feeds import Feed +from django.contrib.syndication.feeds import Feed, FeedDoesNotExist from django.utils.feedgenerator import Atom1Feed -from ietf.idtracker.models import InternetDraft, DocumentComment +from ietf.idtracker.models import IDInternal import datetime +import re class DocumentComments(Feed): feed_type = Atom1Feed def get_object(self, bits): if len(bits) != 1: - raise InternetDraft.DoesNotExist - return InternetDraft.objects.get(filename=bits[0]) + raise IDInternal.DoesNotExist + rfc = re.match('rfc(\d+)', bits[0]) + if rfc: + return IDInternal.objects.get(draft_id=int(rfc.group(1)), rfc_flag=1) + else: + return IDInternal.objects.get(draft__filename=bits[0], rfc_flag=0) def title(self, obj): - return "I-D Tracker comments for %s" % obj.filename + return "I-D Tracker comments for %s" % obj.document().filename def link(self, obj): - return "/idtracker/%s" % obj.filename - # obj.get_absolute_url() ? + if obj is None: + raise FeedDoesNotExist + return obj.get_absolute_url() def description(self, obj): - self.title(obj) + return self.title(obj) def items(self, obj): - return DocumentComment.objects.filter(document=obj.id_document_tag).order_by("-date")[:15] + return obj.public_comments().order_by("-date")[:15] def item_pubdate(self, item): time = datetime.time(*[int(t) for t in item.time.split(":")]) diff --git a/ietf/idtracker/fixtures/initial_data.xml b/ietf/idtracker/fixtures/initial_data.xml deleted file mode 100644 index 83b30c4e8..000000000 --- a/ietf/idtracker/fixtures/initial_data.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 14966 - IAD - - diff --git a/ietf/idtracker/fixtures/wgtest.xml b/ietf/idtracker/fixtures/wgtest.xml new file mode 100644 index 000000000..5c7bd6174 --- /dev/null +++ b/ietf/idtracker/fixtures/wgtest.xml @@ -0,0 +1,151 @@ + + + + + + Hermey + HERMEY + + + Elf + ELF + + 2007-07-02 + + 2007-07-02 + + + + + + + Kris + KRIS + + + Kringle + KRINGLE + + 2007-07-02 + + 2007-07-02 + + + + + + + Snow + SNOW + + + Miser + MISER + + 2007-07-02 + + 2007-07-02 + + + + + + + Rudolph + RUDOLPH + + + Reindeer + REINDEER + + 2007-07-02 + + 2007-07-02 + + + + + 1 + 1 + + + 2 + 2 + + + 1 + + + + + 1 + + + + + + + + 2007-07-02 + + + + 3 + + + + + 1 + + + + + + + + 2007-07-02 + + + + xmas + Christmas + CHRISTMAS + + + snow + Silly New Operational Work + SILLY NEW OPERATIONAL WORK + + + WG + + + PWG + + + BOF + + + AG + + + TEAM + + + Active + + + Dormant + + + Concluded + + + 1 + 3 + + + 1 + 4 + + diff --git a/ietf/idtracker/models.py b/ietf/idtracker/models.py index 2e0dcb790..575990c28 100644 --- a/ietf/idtracker/models.py +++ b/ietf/idtracker/models.py @@ -2,6 +2,7 @@ from django.db import models from ietf.utils import FKAsOneToOne +from django.test import TestCase class Acronym(models.Model): acronym_id = models.AutoField(primary_key=True) @@ -760,7 +761,7 @@ class WGChair(models.Model): def __str__(self): return "%s (%s)" % ( self.person, self.role() ) def role(self): - return "%s %s Chair" % ( self.group_acronym.acronym, self.group_acronym.group_type ) + return "%s %s Chair" % ( self.group_acronym, self.group_acronym.group_type ) class Meta: db_table = 'g_chairs' verbose_name = "WG Chair" @@ -781,7 +782,7 @@ class WGSecretary(models.Model): def __str__(self): return "%s (%s)" % ( self.person, self.role() ) def role(self): - return "%s %s Secretary" % ( self.group_acronym.acronym, self.group_acronym.group_type ) + return "%s %s Secretary" % ( self.group_acronym, self.group_acronym.group_type ) class Meta: db_table = 'g_secretaries' verbose_name = "WG Secretary" @@ -793,7 +794,7 @@ class WGTechAdvisor(models.Model): def __str__(self): return "%s (%s)" % ( self.person, self.role() ) def role(self): - return "%s Technical Advisor" % self.group_acronym.acronym + return "%s Technical Advisor" % self.group_acronym class Meta: db_table = 'g_tech_advisors' verbose_name = "WG Technical Advisor" @@ -833,6 +834,19 @@ class GoalMilestone(models.Model): list_filter = ['done'] pass +class WGRoleTest(TestCase): + fixtures = ['wgtest'] + + def setUp(self): + self.xmas = IETFWG.objects.get(group_acronym__acronym='xmas') + self.snow = IETFWG.objects.get(group_acronym__acronym='snow') + + def test_roles(self): + self.assertEquals(self.xmas.wgchair_set.all()[0].role(), 'xmas WG Chair') + self.assertEquals(self.snow.wgchair_set.all()[0].role(), 'snow BOF Chair') + self.assertEquals(self.xmas.wgsecretary_set.all()[0].role(), 'xmas WG Secretary') + self.assertEquals(self.xmas.wgtechadvisor_set.all()[0].role(), 'xmas Technical Advisor') + #### end wg stuff class Role(models.Model): @@ -905,3 +919,4 @@ class DocumentWrapper(object): primary_flag = 1 def __init__(self, document): self.document = document + diff --git a/ietf/idtracker/templatetags/ietf_filters.py b/ietf/idtracker/templatetags/ietf_filters.py index fd59acee2..907251f2f 100644 --- a/ietf/idtracker/templatetags/ietf_filters.py +++ b/ietf/idtracker/templatetags/ietf_filters.py @@ -25,24 +25,62 @@ def expand_comma(value): def parse_email_list(value): """ Parse a list of comma-seperated email addresses into - a list of mailto: links.""" - addrs = re.split(", ?", value) - ret = [] - for addr in addrs: - (name, email) = emailutils.parseaddr(addr) - if not(name): - name = email - ret.append('%s' % ( fix_ampersands(email), escape(name) )) - return ", ".join(ret) + a list of mailto: links. + Splitting a string of email addresses should return a list: + + >>> parse_email_list('joe@example.org, fred@example.com') + 'joe@example.org, fred@example.com' + + Parsing a non-string should return the input value, rather than fail: + + >>> parse_email_list(['joe@example.org', 'fred@example.com']) + ['joe@example.org', 'fred@example.com'] + + Null input values should pass through silently: + + >>> parse_email_list('') + '' + + >>> parse_email_list(None) + + + """ + if value and type(value) == type(""): # testing for 'value' being true isn't necessary; it's a fast-out route + addrs = re.split(", ?", value) + ret = [] + for addr in addrs: + (name, email) = emailutils.parseaddr(addr) + if not(name): + name = email + ret.append('%s' % ( fix_ampersands(email), escape(name) )) + return ", ".join(ret) + else: + return value + # there's an "ahref -> a href" in GEN_UTIL # but let's wait until we understand what that's for. @register.filter(name='make_one_per_line') def make_one_per_line(value): """ - Turn a comma-separated list into a carraige-return-seperated list.""" - return re.sub(", ?", "\n", value) + Turn a comma-separated list into a carraige-return-seperated list. + >>> make_one_per_line("a, b, c") + 'a\\nb\\nc' + + Pass through non-strings: + + >>> make_one_per_line([1, 2]) + [1, 2] + + >>> make_one_per_line(None) + + """ + if value and type(value) == type(""): + return re.sub(", ?", "\n", value) + else: + return value + @register.filter(name='link_if_url') def link_if_url(value): """ @@ -174,3 +212,10 @@ def inpast(date): if date: return date < datetime.datetime.now() return True + +def _test(): + import doctest + doctest.testmod() + +if __name__ == "__main__": + _test() diff --git a/ietf/idtracker/templatetags/versiontags.py b/ietf/idtracker/templatetags/versiontags.py new file mode 100644 index 000000000..893e4b407 --- /dev/null +++ b/ietf/idtracker/templatetags/versiontags.py @@ -0,0 +1,29 @@ +# Copyright The IETF Trust 2007, All Rights Reserved + +from django import template +from ietf import __date__, __rev__, __version__, __id__ + + +register = template.Library() + + +@register.simple_tag +def revision_time(): + return __date__[7:32] + +@register.simple_tag +def revision_date(): + return __date__[34:-3] + +@register.simple_tag +def revision_num(): + return __rev__[6:-2] + +@register.simple_tag +def revision_id(): + return __id__[5:-2] + +@register.simple_tag +def version_num(): + return __version__ + diff --git a/ietf/idtracker/tests.py b/ietf/idtracker/tests.py new file mode 100644 index 000000000..535dcb73e --- /dev/null +++ b/ietf/idtracker/tests.py @@ -0,0 +1,12 @@ +#import doctest +#import templatetags.ietf_filters +from django.test import TestCase + +class IDTrackerTest(TestCase): + def testDoctest(self): + # doctests in models.py will be automatically tested when running + # django's 'test' command, but for other modules we need to make a + # bit of extra effort to have doctests run. + + #doctest.testmod(templatetags.ietf_filters) + pass \ No newline at end of file diff --git a/ietf/idtracker/testurls.list b/ietf/idtracker/testurls.list index 49247cf9d..a1318b1b6 100644 --- a/ietf/idtracker/testurls.list +++ b/ietf/idtracker/testurls.list @@ -8,7 +8,7 @@ 200 /idtracker/status/ skipdiff,200 /idtracker/status/last-call/ https://datatracker.ietf.org/public/lastcall.cgi 200 /idtracker/rfc3847/ https://datatracker.ietf.org/public/pidtracker.cgi?command=view_id&dTag=3847&rfc_flag=1 -200 /idtracker/12689/ https://datatracker.ietf.org/public/pidtracker.cgi?command=view_id&dTag=12689&rfc_flag=0 +301,skipdiff /idtracker/12689/ https://datatracker.ietf.org/public/pidtracker.cgi?command=view_id&dTag=12689&rfc_flag=0 skipredirect,200 /idtracker/draft-ietf-isis-link-attr/ https://datatracker.ietf.org/public/pidtracker.cgi?command=view_id&dTag=12689&rfc_flag=0 skipredirect,200 /idtracker/draft-ietf-isis-link-attr/comment/65232/ https://datatracker.ietf.org/public/pidtracker.cgi?command=view_comment&id=65232 200 /idtracker/comment/65232/ https://datatracker.ietf.org/public/pidtracker.cgi?command=view_comment&id=65232 diff --git a/ietf/idtracker/urls.py b/ietf/idtracker/urls.py index 82494ded6..78b5e1d6b 100644 --- a/ietf/idtracker/urls.py +++ b/ietf/idtracker/urls.py @@ -30,9 +30,9 @@ urlpatterns += patterns('', ) urlpatterns += patterns('django.views.generic.list_detail', (r'^rfc(?P\d+)/$', 'object_detail', rfc_dict), - (r'^(?P\d+)/$', 'object_detail', id_dict), ) urlpatterns += patterns('', + (r'^(?P\d+)/$', views.redirect_id), (r'^(?P[^/]+)/$', views.view_id, dict(id_dict, slug_field='draft__filename')), (r'^comment/(?P\d+)/$', views.view_comment, comment_dict), (r'^ballot/(?P\d+)/$', views.view_ballot, ballot_dict), diff --git a/ietf/idtracker/views.py b/ietf/idtracker/views.py index 2501b3585..4315c6978 100644 --- a/ietf/idtracker/views.py +++ b/ietf/idtracker/views.py @@ -1,15 +1,17 @@ # Copyright The IETF Trust 2007, All Rights Reserved # Create your views here. -from django.http import HttpResponseRedirect +from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect from django import newforms as forms from django.template import RequestContext from django.shortcuts import get_object_or_404, render_to_response from django.db.models import Q +from django.core.urlresolvers import reverse from django.views.generic.list_detail import object_detail, object_list from ietf.idtracker.models import InternetDraft, IDInternal, IDState, IDSubState, Rfc, DocumentWrapper from ietf.idtracker.forms import IDSearch, EmailFeedback from ietf.utils.mail import send_mail_text +from ietf.utils import normalize_draftname import re # Override default form field mappings @@ -33,6 +35,8 @@ def search(request): # "job_owner" of "0" means "All/Any" if args.get('search_job_owner', '') == '0': args['search_job_owner'] = '' + if args.has_key('search_filename'): + args['search_filename'] = normalize_draftname(args['search_filename']) form = IDSearch(args) # if there's a post, do the search and supply results to the template searching = False @@ -187,6 +191,11 @@ def last_call(request): queryset = IDInternal.objects.filter(primary_flag=1).filter(cur_state__state__in=('In Last Call', 'Waiting for Writeup', 'Waiting for AD Go-Ahead')).order_by('cur_state', 'status_date', 'ballot_id') return object_list(request, template_name="idtracker/status_of_items.html", queryset=queryset, extra_context={'title': 'Documents in Last Call'}) +def redirect_id(request, object_id): + '''Redirect from historical document ID to preferred filename url.''' + doc = get_object_or_404(InternetDraft, id_document_tag=object_id) + return HttpResponsePermanentRedirect(reverse(view_id, args=[doc.filename])) + # Wrappers around object_detail to give permalink a handle. # The named-URLs feature in django 0.97 will eliminate the # need for these. diff --git a/ietf/iesg/feeds.py b/ietf/iesg/feeds.py index 804a0c9aa..679f66efb 100644 --- a/ietf/iesg/feeds.py +++ b/ietf/iesg/feeds.py @@ -15,7 +15,7 @@ class IESGMinutes(Feed): return TelechatMinutes.objects.order_by('-telechat_date')[:10] def item_link(self, item): - return "/iesg/telechat/detail/%d/" % (item.id) + return "/iesg/telechat/%d/" % (item.id) # The approval date isn't stored, so let's just say they're # published on the date of the telechat. diff --git a/ietf/iesg/testurl.list b/ietf/iesg/testurl.list index 60413b52a..a72b6b2f6 100644 --- a/ietf/iesg/testurl.list +++ b/ietf/iesg/testurl.list @@ -4,7 +4,8 @@ 200 /iesg/telechat/354/ https://datatracker.ietf.org/public/view_telechat_minute.cgi?command=view_minute&id=354 200,sort /iesg/ann/ind/ https://datatracker.ietf.org/public/rfc_editor_announcement.cgi 200,sort,ignore:1 /iesg/ann/new/ https://datatracker.ietf.org/public/recent_announcement.cgi -200,sort /iesg/ann/prev/ https://datatracker.ietf.org/public/previous_announcement.cgi +# This takes ~ 300s: +#200,sort /iesg/ann/prev/ https://datatracker.ietf.org/public/previous_announcement.cgi 200 /iesg/ann/2422/ https://datatracker.ietf.org/public/recent_announcement.cgi?command=show_detail&ballot_id=2422 200 /iesg/ann/1563/ https://datatracker.ietf.org/public/previous_announcement.cgi?command=show_detail&ballot_id=1563 404 /iesg/ann/567/ diff --git a/ietf/ipr/new.py b/ietf/ipr/new.py index 762549af8..f4e296538 100644 --- a/ietf/ipr/new.py +++ b/ietf/ipr/new.py @@ -6,7 +6,7 @@ import ietf.utils import django.newforms as forms from datetime import datetime -from django.shortcuts import render_to_response as render +from django.shortcuts import render_to_response as render, get_object_or_404 from django.template import RequestContext from django.http import Http404 from ietf.utils import log @@ -313,6 +313,14 @@ def new(request, type, update=None, submitter=None): def update(request, ipr_id=None): """Update a specific IPR disclosure""" + ipr = get_object_or_404(models.IprDetail, ipr_id=ipr_id) + if not ipr.status in [1,3]: + raise Http404 + type = "specific" + if ipr.generic: + type = "generic" + if ipr.third_party: + type = "third-party" # We're either asking for initial permission or we're in # the general ipr form. If the POST argument has the first # field of the ipr form, then we must be dealing with that, @@ -332,18 +340,10 @@ def update(request, ipr_id=None): if not(form.is_valid()): for error in form.errors: log("Form error for field: %s: %s"%(error, form.errors[error])) - return render("ipr/update.html", {"form": form}, context_instance=RequestContext(request)) + return render("ipr/update.html", {"form": form, "ipr": ipr, "type": type}, context_instance=RequestContext(request)) else: submitter = form.clean_data - ipr = models.IprDetail.objects.get(ipr_id=ipr_id) - if not ipr.status in [1,3]: - raise Http404 - type = "specific" - if ipr.generic: - type = "generic" - if ipr.third_party: - type = "third-party" return new(request, type, ipr, submitter) diff --git a/ietf/ipr/search.py b/ietf/ipr/search.py index 2bb346c2d..64edae949 100644 --- a/ietf/ipr/search.py +++ b/ietf/ipr/search.py @@ -9,7 +9,7 @@ from django.conf import settings from ietf.idtracker.models import IETFWG, InternetDraft, Rfc from ietf.ipr.models import IprRfc, IprDraft, IprDetail from ietf.ipr.related import related_docs -from ietf.utils import log +from ietf.utils import log, normalize_draftname def mark_last_doc(iprs): @@ -80,8 +80,10 @@ def search(request, type="", q="", id=""): # Search by RFC number or draft-identifier # Document list with IPRs if type in ["document_search", "rfc_search"]: + doc = q if type == "document_search": if q: + q = normalize_draftname(q) start = InternetDraft.objects.filter(filename__contains=q) if id: start = InternetDraft.objects.filter(id_document_tag=id) @@ -90,18 +92,20 @@ def search(request, type="", q="", id=""): start = Rfc.objects.filter(rfc_number=q) if start.count() == 1: first = start[0] + doc = str(first) # get all related drafts, then search for IPRs on all docs = related_docs(first, []) #docs = get_doclist.get_doclist(first) iprs, docs = iprs_from_docs(docs) - return render("ipr/search_doc_result.html", {"q": q, "first": first, "iprs": iprs, "docs": docs}, + return render("ipr/search_doc_result.html", {"q": q, "first": first, "iprs": iprs, "docs": docs, "doc": doc }, context_instance=RequestContext(request) ) elif start.count(): return render("ipr/search_doc_list.html", {"q": q, "docs": start }, context_instance=RequestContext(request) ) else: - raise ValueError("Missing or malformed search parameters, or internal error") + return render("ipr/search_doc_result.html", {"q": q, "first": {}, "iprs": {}, "docs": {}, "doc": doc }, + context_instance=RequestContext(request) ) # Search by legal name # IPR list with documents diff --git a/ietf/ipr/testurl.list b/ietf/ipr/testurl.list index 52e856f79..6516fbb02 100644 --- a/ietf/ipr/testurl.list +++ b/ietf/ipr/testurl.list @@ -1,26 +1,32 @@ # -*- conf-mode -*- -200 /ipr/ https://datatracker.ietf.org/public/ipr_list.cgi -200 /ipr/ipr-657/ https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=657 # Generic disclosure -200 /ipr/ipr-834/ https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=834 # Specific disclosure -200 /ipr/ipr-795/ https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=795 # Third-party disclosure -200 /ipr/new-generic/ https://datatracker.ietf.org/public/ipr_generic.cgi -200 /ipr/new-specific/ https://datatracker.ietf.org/public/ipr.cgi -200 /ipr/new-third-party/ https://datatracker.ietf.org/public/ipr_notify.cgi -200 /ipr/update/ https://datatracker.ietf.org/public/ipr_update_list.cgi +200 /ipr/ https://datatracker.ietf.org/public/ipr_list.cgi +200 /ipr/657/ https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=657 # Generic disclosure +200 /ipr/834/ https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=834 # Specific disclosure +200 /ipr/795/ https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=795 # Third-party disclosure +200 /ipr/new-generic/ https://datatracker.ietf.org/public/ipr_generic.cgi +200 /ipr/new-specific/ https://datatracker.ietf.org/public/ipr.cgi +200 /ipr/new-third-party/ https://datatracker.ietf.org/public/ipr_notify.cgi +200 /ipr/update/ https://datatracker.ietf.org/public/ipr_update_list.cgi -200 /ipr/update/657/ https://datatracker.ietf.org/public/ipr_generic.cgi?command=update_ipr&ipr_id=657 +200 /ipr/update/657/ https://datatracker.ietf.org/public/ipr_generic.cgi?command=update_ipr&ipr_id=657 +200 /ipr/update/820/ https://datatracker.ietf.org/public/ipr_notify.cgi?command=update_ipr&ipr_id=820 +200 /ipr/update/844/ https://datatracker.ietf.org/public/ipr.cgi?command=update_ipr&ipr_id=844 -200 /ipr/search/ https://datatracker.ietf.org/public/ipr_search.cgi -302 /ipr/search/?option=document_search # incomplete argument set gives redirect +200 /ipr/search/ https://datatracker.ietf.org/public/ipr_search.cgi +302 /ipr/search/?option=document_search # incomplete argument set gives redirect -200 /ipr/search/?document_search=mod&option=document_search https://datatracker.ietf.org/public/ipr_search.cgi?option=document_search&document_search=mod +200 /ipr/search/?document_search=mod&option=document_search https://datatracker.ietf.org/public/ipr_search.cgi?option=document_search&document_search=mod 200,sort /ipr/search/?id_document_tag=2220&option=document_search https://datatracker.ietf.org/public/ipr_search.cgi?option=document_search&id_document_tag=2220 +200,skipredirect /ipr/search/?option=document_search&document_search=draft-housley-tls-authz-extns-05 https://datatracker.ietf.org/ipr/search/?option=document_search&document_search=draft-housley-tls-authz-extns +200,skipredirect /ipr/search/?option=document_search&document_search=draft-housley-tls-authz-extns-05.txt https://datatracker.ietf.org/ipr/search/?option=document_search&document_search=draft-housley-tls-authz-extns -200,sort /ipr/search/?rfc_search=1034&option=rfc_search https://datatracker.ietf.org/public/ipr_search.cgi?option=rfc_search&rfc_search=1034 # Loong result, RFC search -200 /ipr/search/?rfc_search=4444&option=rfc_search https://datatracker.ietf.org/public/ipr_search.cgi?option=rfc_search&rfc_search=4444 # Empty result, RFC search +# This takes ~ 300s: +#200,sort /ipr/search/?rfc_search=1034&option=rfc_search https://datatracker.ietf.org/public/ipr_search.cgi?option=rfc_search&rfc_search=1034 # Loong result, RFC search +200,sort /ipr/search/?rfc_search=1032&option=rfc_search https://datatracker.ietf.org/public/ipr_search.cgi?option=rfc_search&rfc_search=1032 # Loong result, RFC search +200 /ipr/search/?rfc_search=4444&option=rfc_search https://datatracker.ietf.org/public/ipr_search.cgi?option=rfc_search&rfc_search=4444 # Empty result, RFC search -200 /ipr/search/?patent_search=nortel&option=patent_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_search&patent_search=nortel -200 /ipr/search/?patent_search=nortelxz&option=patent_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_search&patent_search=nortelxz # Empty result +200 /ipr/search/?patent_search=nortel&option=patent_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_search&patent_search=nortel +200 /ipr/search/?patent_search=nortelxz&option=patent_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_search&patent_search=nortelxz # Empty result 200,sort,ignore:quote /ipr/search/?wg_search=dnsext&option=wg_search https://datatracker.ietf.org/public/ipr_search.cgi?option=wg_search&wg_search=dnsext #200,sort,ignore:quote /ipr/search/?wg_search=aaa&option=wg_search https://datatracker.ietf.org/public/ipr_search.cgi?option=wg_search&wg_search=aaa # FIXME This fails, needs revisiting @@ -29,17 +35,17 @@ 200,sort,ignore:quote /ipr/search/?option=title_search&title_search=AAA https://datatracker.ietf.org/public/ipr_search.cgi?option=title_search&title_search=AAA 200,sort,ignore:quote /ipr/search/?option=title_search&title_search=AAAxz https://datatracker.ietf.org/public/ipr_search.cgi?option=title_search&title_search=AAAxz # Empty result -200,sort /ipr/search/?patent_info_search=123&option=patent_info_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=123 -200,sort /ipr/search/?patent_info_search=31415&option=patent_info_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=31415 # Empty result +200,sort /ipr/search/?patent_info_search=123&option=patent_info_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=123 +200,sort /ipr/search/?patent_info_search=31415&option=patent_info_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=31415 # Empty result -200 /ipr/search/?patent_info_search=12&option=patent_info_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=12 # Error: at least 3 characters -200 /ipr/search/?patent_info_search=abc&option=patent_info_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=abc # Error: at least 1 digit +200 /ipr/search/?patent_info_search=12&option=patent_info_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=12 # Error: at least 3 characters +200 /ipr/search/?patent_info_search=abc&option=patent_info_search https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=abc # Error: at least 1 digit -200 /ipr/search/?option=ipr_title_search&ipr_title_search=nortel https://datatracker.ietf.org/public/ipr_search.cgi?option=ipr_title_search&ipr_title_search=nortel -200 /ipr/search/?option=ipr_title_search&ipr_title_search=nortelxz https://datatracker.ietf.org/public/ipr_search.cgi?option=ipr_title_search&ipr_title_search=nortelxz # Empty result +200 /ipr/search/?option=ipr_title_search&ipr_title_search=nortel https://datatracker.ietf.org/public/ipr_search.cgi?option=ipr_title_search&ipr_title_search=nortel +200 /ipr/search/?option=ipr_title_search&ipr_title_search=nortelxz https://datatracker.ietf.org/public/ipr_search.cgi?option=ipr_title_search&ipr_title_search=nortelxz # Empty result -200 /ipr/about/ https://datatracker.ietf.org/public/ipr_disclosure.cgi -200 /ipr/2006/ -200 /ipr/2006/feb/ -200 /ipr/by-date/ +200 /ipr/about/ https://datatracker.ietf.org/public/ipr_disclosure.cgi +200 /ipr/y/2006/ +200 /ipr/y/2006/feb/ +200 /ipr/by-date/ diff --git a/ietf/ipr/urls.py b/ietf/ipr/urls.py index 355f76670..ef27ca5ce 100644 --- a/ietf/ipr/urls.py +++ b/ietf/ipr/urls.py @@ -6,7 +6,7 @@ from ietf.ipr import models, views, new, search urlpatterns = patterns('', (r'^$', views.showlist), (r'^about/$', views.default), - (r'^ipr-(?P\d+)/$', views.show), + (r'^(?P\d+)/$', views.show), (r'^update/$', views.updatelist), (r'^update/(?P\d+)/$', new.update), (r'^new-(?Pspecific)/$', new.new), @@ -20,8 +20,8 @@ archive = {'queryset':queryset, 'date_field': 'submitted_date', 'allow_empty':Tr urlpatterns += patterns('django.views.generic.date_based', (r'^by-date/$', 'archive_index', archive), - (r'^(?P\d{4})/$', 'archive_year', archive), - (r'^(?P\d{4})/(?P[a-z]{3})/$', 'archive_month', archive), + (r'^y/(?P\d{4})/$', 'archive_year', archive), + (r'^y/(?P\d{4})/(?P[a-z]{3})/$', 'archive_month', archive), ) diff --git a/ietf/ipr/views.py b/ietf/ipr/views.py index 6243abfb2..ff2f64401 100644 --- a/ietf/ipr/views.py +++ b/ietf/ipr/views.py @@ -1,7 +1,7 @@ # Copyright The IETF Trust 2007, All Rights Reserved import django.utils.html -from django.shortcuts import render_to_response as render +from django.shortcuts import render_to_response as render, get_object_or_404 from django.template import RequestContext from django.utils.html import escape from django.http import Http404 @@ -47,7 +47,7 @@ def list_all(request, template): def show(request, ipr_id=None): """Show a specific IPR disclosure""" assert ipr_id != None - ipr = IprDetail.objects.get(ipr_id=ipr_id) + ipr = get_object_or_404(IprDetail, ipr_id=ipr_id) if not ipr.status == 1: raise Http404 section_list = get_section_list(ipr) diff --git a/ietf/liaisons/testurl.list b/ietf/liaisons/testurl.list index b31d57093..9acaff7a8 100644 --- a/ietf/liaisons/testurl.list +++ b/ietf/liaisons/testurl.list @@ -5,3 +5,6 @@ 200 /liaison/help/from_ietf/ https://datatracker.ietf.org/public/liaison_guide_from_ietf.cgi 200 /liaison/help/fields/ https://datatracker.ietf.org/public/liaison_field_help.cgi 200 /liaison/help/ + +# Test case for ticket #182: +200 /liaison/337/ diff --git a/ietf/redirects/fixtures/initial_data.xml b/ietf/redirects/fixtures/initial_data.xml index bbd4f238f..09269ead8 100644 --- a/ietf/redirects/fixtures/initial_data.xml +++ b/ietf/redirects/fixtures/initial_data.xml @@ -99,7 +99,7 @@ public/ipr_detail_show.cgi ipr - ipr-%(ipr_id)s + %(ipr_id)s @@ -116,20 +116,20 @@ public/ipr_generic.cgi - ipr/new-generic - + ipr + new-generic public/ipr_notify.cgi - ipr/new-third-party - + ipr + new-third-party public/ipr.cgi - ipr/new-specific - + ipr + new-specific @@ -272,7 +272,7 @@ show_wg_id - wg + wgid 7 4 @@ -318,6 +318,24 @@ 7 8 + + update_ipr + update + 20 + 9 + + + update_ipr + update + 22 + 9 + + + update_ipr + update + 21 + 9 + %(fl)s @@ -342,4 +360,8 @@ %(id)s/related + + %(ipr_id)s + + diff --git a/ietf/redirects/models.py b/ietf/redirects/models.py index 41d8ce7c0..854742d0a 100644 --- a/ietf/redirects/models.py +++ b/ietf/redirects/models.py @@ -15,7 +15,7 @@ class Redirect(models.Model): searched for in the Command table to see if there is a different value of rest= and remove=. """ - cgi = models.CharField(maxlength=50, unique=True) + cgi = models.CharField(maxlength=50, unique=True, blank=True) url = models.CharField(maxlength=255) rest = models.CharField(maxlength=100, blank=True) remove = models.CharField(maxlength=50, blank=True) diff --git a/ietf/redirects/views.py b/ietf/redirects/views.py index 3499140e2..59e6f59f4 100644 --- a/ietf/redirects/views.py +++ b/ietf/redirects/views.py @@ -26,7 +26,8 @@ def redirect(request, path="", script=""): continue if request.REQUEST.has_key(fc[0]): remove_args.append(fc[0]) - if int(request.REQUEST[fc[0]]): + num = re.match('(\d+)', request.REQUEST[fc[0]]) + if num and int(num.group(1)): cmd = flag break # @@ -39,6 +40,10 @@ def redirect(request, path="", script=""): pass # it's ok, there's no more-specific request. except KeyError: pass # it's ok, request didn't have 'command'. + except: + pass # strange exception like the one described in + # http://merlot.tools.ietf.org/tools/ietfdb/ticket/179 ? + # just ignore the command string. if cmd is not None: remove_args.append('command') if cmd.url: diff --git a/ietf/settings.py b/ietf/settings.py index 9343748d0..764a3f7c1 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -51,7 +51,7 @@ SITE_ID = 1 # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. -USE_I18N = True +USE_I18N = False # Absolute path to the directory that holds media. # Example: "/home/media/media.lawrence.com/" @@ -157,6 +157,8 @@ TEST_RUNNER = 'ietf.tests.run_tests' IPR_DOCUMENT_PATH = '/home/master-site/ftp/data/ietf/IPR' +TEST_REFERENCE_URL_PREFIX = 'http://compost.research.att.com/old/' + # Put SECRET_KEY in here, or any other sensitive or site-specific # changes. DO NOT commit settings_local.py to svn. from settings_local import * diff --git a/ietf/templates/404.html b/ietf/templates/404.html index 4ee4cd141..5447cd36d 100644 --- a/ietf/templates/404.html +++ b/ietf/templates/404.html @@ -1,36 +1,47 @@ {# Copyright The IETF Trust 2007, All Rights Reserved #} {% extends "base.html" %} - +{% load versiontags %} {% block content %}
- +
-

The Internet Engineering Task Force

+

The Internet Engineering Task Force


- -
+

-

The page you are looking for cannot be found.


-If it is an Internet-Draft, the version may have expired.
-Please visit search.ietf.org and enter in keywords or the name of the draft without the version numbers. +

The page you were looking for couldn't be found.

+
+ The requested URL was not found on this server. If you entered the URL + manually please check your spelling and try again. +
+
+
+ + If you think this is a server error, please contact webtools@ietf.org.

-For other Web page issues, please contact webmaster@ietf.org.
-
- -
Blue Line
+ +{% endblock %} + +{% block footer %} +
+
+ Made with django + v{% version_num %}, {% revision_date %} - webtools@ietf.org +
{% endblock %} diff --git a/ietf/templates/500.html b/ietf/templates/500.html index 07c75781e..b4258fe48 100644 --- a/ietf/templates/500.html +++ b/ietf/templates/500.html @@ -1,34 +1,45 @@ {# Copyright The IETF Trust 2007, All Rights Reserved #} {% extends "base.html" %} - +{% load versiontags %} {% block content %}
- +
-

The Internet Engineering Task Force

+

The Internet Engineering Task Force


- -
+

-

Error 500

-

Internal Server Error

+

Internal Server Error.

+
+ The server encountered an internal error and was + unable to complete your request. Either the server is + overloaded or there was an error in a script used to + generate the requested page. +


-Please contact webmaster@ietf.org.
+Please contact webtools@ietf.org.

- -
Blue Line
+ +{% endblock %} + +{% block footer %} +
+
+ Made with django + v{% version_num %}, {% revision_date %} - webtools@ietf.org +
{% endblock %} diff --git a/ietf/templates/base-new.html b/ietf/templates/base-new.html index 9e6dd0ee6..a3df13943 100644 --- a/ietf/templates/base-new.html +++ b/ietf/templates/base-new.html @@ -14,7 +14,7 @@
  • About the IETF @@ -104,11 +104,7 @@ diff --git a/ietf/templates/base.html b/ietf/templates/base.html index 46e6f911d..fcc0b6e61 100644 --- a/ietf/templates/base.html +++ b/ietf/templates/base.html @@ -24,18 +24,18 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- - - - - - - - - - - - + + + + + + + + + + + +
@@ -50,7 +50,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" {% block content %}{% endblock %} {% block main_content %}{% endblock %} - {% include "footer.html" %} + {% block footer %}{% include "footer.html" %}{% endblock %} {% include "debug.html" %} diff --git a/ietf/templates/googlea30ad1dacffb5e5b.html b/ietf/templates/googlea30ad1dacffb5e5b.html new file mode 100644 index 000000000..91dda3f5b --- /dev/null +++ b/ietf/templates/googlea30ad1dacffb5e5b.html @@ -0,0 +1,17 @@ +{# Copyright The IETF Trust 2007, All Rights Reserved #} +{% extends "base.html" %} +{% load versiontags %} + +{% block content %} + +

This is a verification page for the Google Webmaster Tools.

+ +{% endblock %} + +{% block footer %} +
+
+ Made with django + v{% version_num %}, {% revision_date %} - webtools@ietf.org +
+{% endblock %} diff --git a/ietf/templates/idindex/search.html b/ietf/templates/idindex/search.html index 8fa5b9022..deb8f382d 100644 --- a/ietf/templates/idindex/search.html +++ b/ietf/templates/idindex/search.html @@ -4,6 +4,7 @@ {% block title %}Internet Draft Database Index - Search{% endblock %} {% block iddbcontent %} +
{% if didsearch %} {# existing page just displays header and no results. #} {% if object_list %} diff --git a/ietf/templates/idindex/view_related_docs.html b/ietf/templates/idindex/view_related_docs.html index 0aa86c2e1..6392bf1c5 100644 --- a/ietf/templates/idindex/view_related_docs.html +++ b/ietf/templates/idindex/view_related_docs.html @@ -1,6 +1,8 @@ {# Copyright The IETF Trust 2007, All Rights Reserved #} {% extends "idindex/base.html" %} +{% block title %}Internet Draft Database Index - documents related to {{ startdoc.filename }}{% endblock %} + {% block iddbcontent %}
diff --git a/ietf/templates/idindex/wglist.html b/ietf/templates/idindex/wglist.html index 54b9fcbab..75dc51fc1 100644 --- a/ietf/templates/idindex/wglist.html +++ b/ietf/templates/idindex/wglist.html @@ -4,6 +4,7 @@ {% block iddbcontent %}

Please select a Working Group from the list below

+{% if object_list %}
{% regroup object_list by status as grouped %} {% for status in grouped %} @@ -19,5 +20,8 @@ {% endfor %} {% endfor %} +{% else %} +

No working groups found beginning with "{{ search }}".

+{% endif %} {% endblock %} diff --git a/ietf/templates/idtracker/ballotinfo_detail.html b/ietf/templates/idtracker/ballotinfo_detail.html index d6fd913c7..614fa5da7 100644 --- a/ietf/templates/idtracker/ballotinfo_detail.html +++ b/ietf/templates/idtracker/ballotinfo_detail.html @@ -2,7 +2,7 @@ {% extends "idtracker/base.html" %} {% load ietf_filters %} -{% block title %}IESG Announcement{% endblock %} +{% block title %}-- Ballot for {{ object.drafts.all.0.document.filename }}{% endblock %} {% block idcontent %}
diff --git a/ietf/templates/idtracker/base.html b/ietf/templates/idtracker/base.html
index 9db9954fb..804c01e9d 100644
--- a/ietf/templates/idtracker/base.html
+++ b/ietf/templates/idtracker/base.html
@@ -2,7 +2,7 @@
 
 
       
-      {% block title %}IETF Data{% endblock %}{% ifnotequal server_mode "production" %} - {{ server_mode|upper }} MODE{% endifnotequal %}
+      IETF I-D Tracker {% block title %}{% endblock %}{% ifnotequal server_mode "production" %} - {{ server_mode|upper }} MODE{% endifnotequal %}
       {% ifnotequal server_mode "production" %}
       
       {% else %}
diff --git a/ietf/templates/idtracker/documentcomment_detail.html b/ietf/templates/idtracker/documentcomment_detail.html
index 122a70b69..70067c80e 100644
--- a/ietf/templates/idtracker/documentcomment_detail.html
+++ b/ietf/templates/idtracker/documentcomment_detail.html
@@ -3,6 +3,8 @@
 
 {% load ietf_filters %}
 
+{% block title %}-- comment on {{ object.document.document.filename }}{% endblock %}
+
 {% block idcontent %}
 
 {% if object.ballot %}
@@ -11,15 +13,16 @@
    
+ - + {% if object.origin_state %} {% endif %} {% if object.result_state %} {% endif %} - +
Date and Time:{{ object.date }}, {{ object.time }}
Document:{{ object.document.document.filename }}
Version:{{ object.version }}
Commented by:{{ object.created_by.first_name }} {{ object.created_by.last_name }}
Commented by:{{ object.get_author }}
State before Comment:{{ object.origin_state }}
State after Comment:{{ object.result_state }}
Comment:{{ object.comment_text|format_textarea }}
Comment:{{ object.comment_text|format_textarea }}
diff --git a/ietf/templates/idtracker/idinternal_detail.html b/ietf/templates/idtracker/idinternal_detail.html index 401bdb6c7..d653751a2 100644 --- a/ietf/templates/idtracker/idinternal_detail.html +++ b/ietf/templates/idtracker/idinternal_detail.html @@ -3,6 +3,8 @@ {% load ietf_filters %} +{% block title %}-- {{ object.document.filename }}{% endblock %} + {% block idcontent %} @@ -282,19 +284,5 @@ - -
- -

Did you find a bug? Let us - know.

- -

Any - question or suggestion?

- -

This page produced by the IETF Secretariat for - the IESG

{% endblock %} diff --git a/ietf/templates/idtracker/idtracker_search.html b/ietf/templates/idtracker/idtracker_search.html index 5337d1166..ad86194f5 100644 --- a/ietf/templates/idtracker/idtracker_search.html +++ b/ietf/templates/idtracker/idtracker_search.html @@ -25,7 +25,7 @@
{% if searching %} {% else %} -
+

IETF I-D TRACKER

{% endif %} @@ -74,8 +74,8 @@ Document States: State Diagram and
-
{% if matches %} +
Search Result
{% regroup matches by docstate as grouped %} {% include "idtracker/search_result_table.html" %} diff --git a/ietf/templates/ipr/details.html b/ietf/templates/ipr/details.html index 4f2c8eeb3..1724d93a0 100644 --- a/ietf/templates/ipr/details.html +++ b/ietf/templates/ipr/details.html @@ -108,15 +108,15 @@ There are 3 different IPR disclosures that can be made:

- + "Specific": A disclosure about your IPR related to a specific IETF contribution

- + "Generic": An IPR disclosure about your IPR that is not related to a specific IETF contribution

- + "Third-Party": Notify the IETF of IPR other than your own which you believe may be related to a specific IETF contribution

{% endif %} @@ -564,8 +564,8 @@

- IPR Disclosure Page
- View IPR Disclosures

+ IPR Disclosure Page
+ View IPR Disclosures

{% endif %} diff --git a/ietf/templates/ipr/disclosure.html b/ietf/templates/ipr/disclosure.html index 868028e67..06d920890 100644 --- a/ietf/templates/ipr/disclosure.html +++ b/ietf/templates/ipr/disclosure.html @@ -3,11 +3,11 @@ {% block title %}IPR Disclosure Page{% endblock %} {% block content %}
- +
- +

This page provides a mechanism for filing Disclosures about intellectual property rights @@ -25,17 +25,17 @@


- File a disclosure about your IPR related to a specific IETF contribution + File a disclosure about your IPR related to a specific IETF contribution

-

File an IPR disclosure that is not related to a specific IETF contribution +

File an IPR disclosure that is not related to a specific IETF contribution

-

Notify the IETF of IPR other than your own +

Notify the IETF of IPR other than your own

-

Update an existing IPR disclosure +

Update an existing IPR disclosure

-

Search the IPR disclosures +

Search the IPR disclosures

-

List of IPR disclosures

+

List of IPR disclosures


To remove an IPR disclosure from the list, please contact the IETF Secretariat at ietf-ipr@ietf.org. @@ -65,8 +65,5 @@ A participant in any IETF activity acknowledges that written, audio and video re An Internet-Draft intended by the Contributor to be submitted to the RFC Editor for publication as an Informational or Experimental RFC but not intended to be part of the IETF Standards Process.

-
-

Please report any problems to ietf-action@ietf.org -

{% endblock %} diff --git a/ietf/templates/ipr/iprdetail_archive.html b/ietf/templates/ipr/iprdetail_archive.html index 3aab3e94a..b48f0b265 100644 --- a/ietf/templates/ipr/iprdetail_archive.html +++ b/ietf/templates/ipr/iprdetail_archive.html @@ -22,7 +22,7 @@

Archives by Year

diff --git a/ietf/templates/ipr/iprdetail_archive_year.html b/ietf/templates/ipr/iprdetail_archive_year.html index 3b9a4dddf..b6a4416ae 100644 --- a/ietf/templates/ipr/iprdetail_archive_year.html +++ b/ietf/templates/ipr/iprdetail_archive_year.html @@ -6,7 +6,7 @@ {% block content %}

IPR Declarations - {{ year }}

-All dates +All dates
-

Back to Top

+

Back to Top

Specific IPR Disclosures


@@ -49,7 +49,7 @@ which any license under such rights might or might not be available; nor does it
-

Back to Top

+

Back to Top

Specific Third Party IPR Disclosures


@@ -58,11 +58,6 @@ which any license under such rights might or might not be available; nor does it {% include "ipr/list_item.html" %} {% endfor %}
- -
-

Please report any problems to ietf-act - ion@ietf.org -



{% endblock %} \ No newline at end of file diff --git a/ietf/templates/ipr/search.html b/ietf/templates/ipr/search.html index d574a232d..2cf601ebf 100644 --- a/ietf/templates/ipr/search.html +++ b/ietf/templates/ipr/search.html @@ -109,6 +109,6 @@




-
IPR Disclosure Page +
IPR Disclosure Page
{% endblock %} diff --git a/ietf/templates/ipr/search_doc_result.html b/ietf/templates/ipr/search_doc_result.html index 6ed92cd65..14e130fca 100644 --- a/ietf/templates/ipr/search_doc_result.html +++ b/ietf/templates/ipr/search_doc_result.html @@ -2,42 +2,42 @@ {% extends "ipr/search_result.html" %} {% load ietf_filters %} {% block search_result %} - +
- - {% for ipr in iprs|dictsort:"submitted_date" %} - - - - - - {% endfor %} + + {% for ipr in iprs|dictsort:"submitted_date" %} + + + + + + {% endfor %} - - {% for doc in docs %} - - - - - {% if doc.iprs %} - {% for ipr in doc.iprs %} - - - - - - {% endfor %} - {% else %} - - - - - {% endif %} - - {% endfor %} + + {% for doc in docs %} + + + + + {% if doc.iprs %} + {% for ipr in doc.iprs %} + + + + + + {% endfor %} + {% else %} + + + + + {% endif %} + + {% endfor %} -
Total number of IPR disclosures found: {{ iprs|length }}
{{ ipr.submitted_date }}
  • ID # {{ ipr.ipr_id }}
  • "{{ ipr.title }}"
    Total number of IPR disclosures found: {{ iprs|length }}
    {{ ipr.submitted_date }}
  • ID # {{ ipr.ipr_id }}
  • "{{ ipr.title }}"

    Total number of documents searched: {{ docs|length}}
    - Search result on {{ doc|rfcspace|lstrip:"0"|rfcnospace }}, "{{ doc.title }}"{% ifnotequal doc first %}{% if doc.related %}, {{ doc.relation }} {{ doc.related|rfcspace|lstrip:"0"|rfcnospace }}, "{{ doc.related.title }}"{% endif %} - {% endifnotequal %} -
    {{ ipr.submitted_date }}
  • ID # {{ ipr.ipr_id }}
  • "{{ ipr.title }}"
    No IPR disclosures related to {{ doc|rfcspace|lstrip:"0" }} have been submitted

    Total number of documents searched: {{ docs|length}}
    + Search result on {{ doc|rfcspace|lstrip:"0"|rfcnospace }}, "{{ doc.title }}"{% ifnotequal doc first %}{% if doc.related %}, {{ doc.relation }} {{ doc.related|rfcspace|lstrip:"0"|rfcnospace }}, "{{ doc.related.title }}"{% endif %} + {% endifnotequal %} +
    {{ ipr.submitted_date }}
  • ID # {{ ipr.ipr_id }}
  • "{{ ipr.title }}"
    No IPR disclosures related to {{ doc|rfcspace|lstrip:"0" }} have been submitted
    + {% endblock %} diff --git a/ietf/templates/ipr/search_doctitle_result.html b/ietf/templates/ipr/search_doctitle_result.html index 794f54736..73e1227a3 100644 --- a/ietf/templates/ipr/search_doctitle_result.html +++ b/ietf/templates/ipr/search_doctitle_result.html @@ -29,18 +29,12 @@ {{ ipr.submitted_date }}
  • ID # {{ ipr.ipr_id }}
  • - {% for item in ipr.updated_by.all %} {% ifequal item.processed 1 %} IPR disclosure ID# {{ item.ipr.ipr_id }} "{{ item.ipr.title }}" Updates {% endifequal %} {% endfor %} - "{{ ipr.title }}" + "{{ ipr.title }}" {% endfor %} diff --git a/ietf/templates/ipr/search_result.html b/ietf/templates/ipr/search_result.html index b70deac47..03e327c70 100644 --- a/ietf/templates/ipr/search_result.html +++ b/ietf/templates/ipr/search_result.html @@ -64,8 +64,8 @@ {% endblock %}

    - IPR Search Main Page
    - IPR Disclosure Page + IPR Search Main Page
    + IPR Disclosure Page
    {% endblock %} diff --git a/ietf/templates/ipr/search_wg_result.html b/ietf/templates/ipr/search_wg_result.html index bd109b7f7..99dff9594 100644 --- a/ietf/templates/ipr/search_wg_result.html +++ b/ietf/templates/ipr/search_wg_result.html @@ -35,12 +35,7 @@ IPR disclosure ID# {{ item.updated.ipr_id }}, "{{ item.updated.title }}" Updated by {% endifequal %} {% endfor %} - "{{ ipr.title }}" - + "{{ ipr.title }}" {% endfor %} diff --git a/ietf/templates/ipr/update.html b/ietf/templates/ipr/update.html index bd9073b78..aee1140c3 100644 --- a/ietf/templates/ipr/update.html +++ b/ietf/templates/ipr/update.html @@ -5,6 +5,8 @@ {% include "ipr/style.html" %} +

    Updating {{ type|title }} IPR Disclosures
    {{ ipr.title|escape }}

    +
    {% if form.errors %}

    diff --git a/ietf/templates/ipr/update_list.html b/ietf/templates/ipr/update_list.html index 5be49da6f..d4b85d015 100644 --- a/ietf/templates/ipr/update_list.html +++ b/ietf/templates/ipr/update_list.html @@ -7,11 +7,11 @@ Click here to submit an IPR disclosure


    -

    Search the IPR Disclosures

    -

    Generic IPR Disclosures

    +

    Search the IPR Disclosures

    +

    Generic IPR Disclosures

    -

    Specific IPR Disclosures

    -

    Specific Third Party IPR Disclosures

    +

    Specific IPR Disclosures

    +

    Specific Third Party IPR Disclosures


    @@ -30,7 +30,7 @@ {% endfor %} -

    Back to Top

    +

    Back to Top

    Specific IPR Disclosures

    Please select the IPR disclosure that you wish to update.
    @@ -47,7 +47,7 @@ {% endfor %}
    -

    Back to Top

    +

    Back to Top

    Specific Third Party IPR Disclosures

    Please select the IPR disclosure that you wish to update.
    diff --git a/ietf/templates/mailinglists/list_wizard_base.html b/ietf/templates/mailinglists/list_wizard_base.html index 3f3a704a4..7eb7ba0f4 100644 --- a/ietf/templates/mailinglists/list_wizard_base.html +++ b/ietf/templates/mailinglists/list_wizard_base.html @@ -52,9 +52,4 @@ clean_forms: {{ clean_forms|escape }} - - -
    -Please send problem reports to ietf-action@ietf.org. - {% endblock %} diff --git a/ietf/templates/meeting/list.html b/ietf/templates/meeting/list.html index bdbe1715f..aa13b570a 100644 --- a/ietf/templates/meeting/list.html +++ b/ietf/templates/meeting/list.html @@ -17,7 +17,7 @@ Updated as of {% now "F j, Y, H:i:s (T)" %} {% for wgs in areas %} -


    {{ wgs.grouper }}

    +


    {{ wgs.grouper }}

    @@ -63,7 +63,7 @@ Updated as of {% now "F j, Y, H:i:s (T)" %} {% if training_list %} -


    Training

    +


    Training

    {% for wg in training_list|dictsort:"acronym" %} @@ -84,7 +84,7 @@ Updated as of {% now "F j, Y, H:i:s (T)" %} {% if irtf_list %}
    -


    IRTF

    +


    IRTF

    @@ -110,7 +110,7 @@ Updated as of {% now "F j, Y, H:i:s (T)" %} {% if interim_list %} -


    Interim Meetings

    +


    Interim Meetings

    diff --git a/ietf/tests.py b/ietf/tests.py index e771590ba..2e532d97c 100644 --- a/ietf/tests.py +++ b/ietf/tests.py @@ -19,11 +19,11 @@ from ietf.utils import log startup_database = settings.DATABASE_NAME # The startup database name, before changing to test_... -def run_tests(module_list, verbosity=1, extra_tests=[]): +def run_tests(module_list, verbosity=0, extra_tests=[]): module_list.append(ietf.urls) # If we append 'ietf.tests', we get it twice, first as itself, then # during the search for a 'tests' module ... - return django.test.simple.run_tests(module_list, verbosity, extra_tests) + return django.test.simple.run_tests(module_list, 0, extra_tests) def reduce_text(html, pre=False, fill=True): if html.count("
  • ") > 5*html.count("
  • "): @@ -90,6 +90,10 @@ def read_testurls(filename): goodurl = None elif len(urlspec) == 3: codes, testurl, goodurl = urlspec + # strip protocol and host -- we're making that configurable + goodurl = re.sub("^https?://[a-z0-9.]+", "", goodurl) + if not goodurl.startswith("/"): + goodurl = "/" + goodurl else: raise ValueError("Expected 'HTTP_CODE TESTURL [GOODURL]' in %s line, found '%s'." % (filename, line)) @@ -289,6 +293,11 @@ class UrlTestCase(TestCase): note("Exception for URL '%s'" % url) traceback.print_exc() if master and not "skipdiff" in codes: + hostprefix = settings.TEST_REFERENCE_URL_PREFIX + if hostprefix.endswith("/"): + hostprefix = hostprefix[:-1] + master = hostprefix + master + goodhtml = None try: #print "Fetching", master, "...", mfile = urllib.urlopen(master) @@ -296,8 +305,9 @@ class UrlTestCase(TestCase): mfile.close() note(" 200 %s" % (master)) except urllib.URLError, e: - note(" Error retrieving %s: %s" % (e.url, e)) - goodhtml = None + note(" Error retrieving %s: %s" % (master, e)) + except urllib.BadStatusLine, e: + note(" Error retrieving %s: %s" % (master, e)) try: if goodhtml and response.content: if "sort" in codes: @@ -335,7 +345,7 @@ class UrlTestCase(TestCase): else: contextlines = 0 difflist = list(unified_diff(goodtext, testtext, master, url, "", "", contextlines, lineterm="")) - diff = "\n".join(difflist) + diff = "\n".join(difflist[2:]) log("Checking diff: %s" % diff[:96]) keys = module.diffchunks.keys() keys.sort @@ -352,7 +362,7 @@ class UrlTestCase(TestCase): # discard them too diff = "" if diff: - dfile = "%s/../test/diff/%s" % (settings.BASE_DIR, url.replace("/", "_").replace("?", "_")) + dfile = "%s/../test/diff/%s" % (settings.BASE_DIR, re.sub("[/?&=]", "_", url) ) if os.path.exists(dfile): dfile = open(dfile) #print "Reading OK diff file:", dfile.name @@ -367,9 +377,9 @@ class UrlTestCase(TestCase): note("Failed diff: %s" % (url)) else: note("Diff: %s" % (url)) - print "\n".join(diff.split("\n")[:120]) - if len(diff.split("\n")) > 120: - print "... (skipping %s lines of diff)" % (len(difflist)-120) + print "\n".join(diff.split("\n")[:100]) + if len(diff.split("\n")) > 100: + print "... (skipping %s lines of diff)" % (len(difflist)-100) else: note("OK cmp %s" % (url)) diff --git a/ietf/testurl.list b/ietf/testurl.list index 9408d6098..84e6e12d6 100644 --- a/ietf/testurl.list +++ b/ietf/testurl.list @@ -1,7 +1,9 @@ # Top-level test URL list. Should probably be empty; all test URls should be # specified in the application level testurl.list -200 / # Top level url. Has no comparable page today. +301 / # Top level url. Has no comparable page today. skip /images/ietf-icon.bmp skip /css/base.css skip /js/ + +200 /googlea30ad1dacffb5e5b.html # Google webmaster tool verification page diff --git a/ietf/urls.py b/ietf/urls.py index 78ea261fd..321cedf22 100644 --- a/ietf/urls.py +++ b/ietf/urls.py @@ -5,8 +5,6 @@ from django.conf.urls.defaults import patterns, include, handler404, handler500 from ietf.iesg.feeds import IESGMinutes from ietf.idtracker.feeds import DocumentComments from ietf.ipr.feeds import LatestIprDisclosures -import ietf.utils.views -import ietf.views from django.conf import settings @@ -31,7 +29,7 @@ urlpatterns = patterns('', (r'^meeting/', include('ietf.meeting.urls')), (r'^accounts/', include('ietf.ietfauth.urls')), - (r'^$', ietf.views.apps), + (r'^$', 'ietf.redirects.views.redirect'), # Uncomment this for admin: (r'^admin/', include('django.contrib.admin.urls')), @@ -42,6 +40,9 @@ urlpatterns = patterns('', (r'^review/(?P[0-9a-f]+)/$', 'ietf.utils.views.review'), (r'^review/top/(?P[0-9a-f]+)/$', 'ietf.utils.views.top'), + # Google webmaster tools verification url + (r'googlea30ad1dacffb5e5b.html', 'django.views.generic.simple.direct_to_template', { 'template': 'googlea30ad1dacffb5e5b.html' }) + ) if settings.SERVER_MODE in ('development', 'test'): diff --git a/ietf/utils/__init__.py b/ietf/utils/__init__.py index f2eecb21e..2c58341c9 100644 --- a/ietf/utils/__init__.py +++ b/ietf/utils/__init__.py @@ -5,6 +5,7 @@ from log import log from cache_foreign_key import FKAsOneToOne from templated_form import makeTemplatedForm from soup2text import TextSoup, soup2text +from draft_search import normalize_draftname makeFormattingForm = makeTemplatedForm diff --git a/ietf/utils/draft_search.py b/ietf/utils/draft_search.py new file mode 100644 index 000000000..5f3798d7c --- /dev/null +++ b/ietf/utils/draft_search.py @@ -0,0 +1,8 @@ +# Copyright The IETF Trust 2007, All Rights Reserved +import re + +def normalize_draftname(string): + string = string.strip() + string = re.sub("\.txt$","",string) + string = re.sub("-\d\d$","",string) + return string diff --git a/static/images/NS_logo_100px.gif b/static/images/NS_logo_100px.gif new file mode 100644 index 000000000..344ba3f43 Binary files /dev/null and b/static/images/NS_logo_100px.gif differ diff --git a/static/images/blue-line.jpg b/static/images/blue-line.jpg new file mode 100644 index 000000000..9cc5defea Binary files /dev/null and b/static/images/blue-line.jpg differ diff --git a/static/images/header/home11.gif b/static/images/header/home11.gif new file mode 100644 index 000000000..0c5f92f7f Binary files /dev/null and b/static/images/header/home11.gif differ diff --git a/static/images/header/id-index11.gif b/static/images/header/id-index11.gif new file mode 100644 index 000000000..ea059b92b Binary files /dev/null and b/static/images/header/id-index11.gif differ diff --git a/static/images/header/ietflogo_sm.gif b/static/images/header/ietflogo_sm.gif new file mode 100644 index 000000000..6f3aa003b Binary files /dev/null and b/static/images/header/ietflogo_sm.gif differ diff --git a/static/images/header/meetings11.gif b/static/images/header/meetings11.gif new file mode 100644 index 000000000..8020e069b Binary files /dev/null and b/static/images/header/meetings11.gif differ diff --git a/static/images/header/proceed11.gif b/static/images/header/proceed11.gif new file mode 100644 index 000000000..5a7db1d34 Binary files /dev/null and b/static/images/header/proceed11.gif differ diff --git a/static/images/header/rfc11.gif b/static/images/header/rfc11.gif new file mode 100644 index 000000000..edd2e9f51 Binary files /dev/null and b/static/images/header/rfc11.gif differ diff --git a/static/images/header/separator.gif b/static/images/header/separator.gif new file mode 100644 index 000000000..bbbd067c1 Binary files /dev/null and b/static/images/header/separator.gif differ diff --git a/static/images/header/wg11.gif b/static/images/header/wg11.gif new file mode 100644 index 000000000..63cee25a8 Binary files /dev/null and b/static/images/header/wg11.gif differ diff --git a/static/images/ib2.gif b/static/images/ib2.gif new file mode 100644 index 000000000..43f4afc26 Binary files /dev/null and b/static/images/ib2.gif differ diff --git a/static/images/ietflogo2e.gif b/static/images/ietflogo2e.gif new file mode 100644 index 000000000..326d4ecaa Binary files /dev/null and b/static/images/ietflogo2e.gif differ diff --git a/static/images/ietflogo2i.png b/static/images/ietflogo2i.png new file mode 100644 index 000000000..657b67c17 Binary files /dev/null and b/static/images/ietflogo2i.png differ diff --git a/static/images/ipr_header.gif b/static/images/ipr_header.gif new file mode 100644 index 000000000..97c575a0b Binary files /dev/null and b/static/images/ipr_header.gif differ diff --git a/static/images/isoc-small.gif b/static/images/isoc-small.gif new file mode 100644 index 000000000..dcc1405bb Binary files /dev/null and b/static/images/isoc-small.gif differ diff --git a/test/diff/_ann_nomcom_1230_ b/test/diff/_ann_nomcom_1230_ index dd4c3616a..f9449b27f 100644 --- a/test/diff/_ann_nomcom_1230_ +++ b/test/diff/_ann_nomcom_1230_ @@ -1,7 +1,8 @@ ---- https://datatracker.ietf.org/public/show_nomcom_message.cgi?id=1230 -+++ /ann/nomcom/1230/ @@ -3,2 +3,2 @@ -IETF Announcement Date: June 3, 2007 Subject: IETF Nomcom Appointment -- 2007-2008 +IETF Announcement list Date: June 3, 2007 Subject: IETF Nomcom +Appointment - 2007-2008 +@@ -10,1 +10,1 @@ +-at . ++at . diff --git a/test/diff/_drafts_ b/test/diff/_drafts_ index 29e27e413..d833b396b 100644 --- a/test/diff/_drafts_ +++ b/test/diff/_drafts_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/idindex.cgi -+++ /drafts/ @@ -16,1 +16,0 @@ -I-D Exists @@ -546,2 +545,2 @@ diff --git a/test/diff/_drafts_dead_ b/test/diff/_drafts_dead_ new file mode 100644 index 000000000..76c29da43 --- /dev/null +++ b/test/diff/_drafts_dead_ @@ -0,0 +1,18 @@ +@@ -4,1 +4,1 @@ +-Expired/Withdrawn/Replaced I-Ds sorted by UNKNOWN ++Expired/Withdrawn/Replaced I-Ds sorted by Filename +@@ -3214,1 +3214,1 @@ +-draft-iab-char-rep-01 2004-02-18 Expired Dead ++draft-iab-char-rep-01 2004-02-18 Expired Dead: : Revised I-D Needed +@@ -4225,1 +4225,1 @@ +-draft-ietf-ldapext-ldap-java-api-19 2004-06-07 Expired Dead ++draft-ietf-ldapext-ldap-java-api-19 2004-06-07 Expired Dead: : Revised I-D Needed +@@ -4331,1 +4331,1 @@ +-draft-ietf-mboned-rfc3171bis-02 2004-03-15 Expired Dead ++draft-ietf-mboned-rfc3171bis-02 2004-03-15 Expired Dead: : Revised I-D Needed +@@ -4470,1 +4470,1 @@ +-draft-ietf-msec-tesla-spec-00 2002-10-30 Expired Dead ++draft-ietf-msec-tesla-spec-00 2002-10-30 Expired Dead: : Revised I-D Needed +@@ -4798,1 +4798,1 @@ +-draft-ietf-ppvpn-vr-mib-05 Replaced I-D Exists ++draft-ietf-ppvpn-vr-mib-05 None Replaced I-D Exists diff --git a/test/diff/_drafts_dead__sort_name b/test/diff/_drafts_dead__sort_name new file mode 100644 index 000000000..3f339fc3e --- /dev/null +++ b/test/diff/_drafts_dead__sort_name @@ -0,0 +1,17 @@ +@@ -1018,1 +1018,0 @@ +-draft-cain-post-inch-phishingextns-00 2006-10-17 Expired I-D Exists +@@ -3215,1 +3214,1 @@ +-draft-iab-char-rep-01 2004-02-18 Expired Dead ++draft-iab-char-rep-01 2004-02-18 Expired Dead: : Revised I-D Needed +@@ -4226,1 +4225,1 @@ +-draft-ietf-ldapext-ldap-java-api-19 2004-06-07 Expired Dead ++draft-ietf-ldapext-ldap-java-api-19 2004-06-07 Expired Dead: : Revised I-D Needed +@@ -4332,1 +4331,1 @@ +-draft-ietf-mboned-rfc3171bis-02 2004-03-15 Expired Dead ++draft-ietf-mboned-rfc3171bis-02 2004-03-15 Expired Dead: : Revised I-D Needed +@@ -4472,1 +4471,1 @@ +-draft-ietf-msec-tesla-spec-00 2002-10-30 Expired Dead ++draft-ietf-msec-tesla-spec-00 2002-10-30 Expired Dead: : Revised I-D Needed +@@ -4799,1 +4798,1 @@ +-draft-ietf-ppvpn-vr-mib-05 Replaced I-D Exists ++draft-ietf-ppvpn-vr-mib-05 None Replaced I-D Exists diff --git a/test/diff/_drafts_rfc_ b/test/diff/_drafts_rfc_ index edccafbdb..9838e0821 100644 --- a/test/diff/_drafts_rfc_ +++ b/test/diff/_drafts_rfc_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/idindex.cgi?command=show_list&cat=rfc -+++ /drafts/rfc/ @@ -12,1 +12,1 @@ -Published I-Ds sorted by UNKNOWN +Published I-Ds sorted by Filename \ No newline at end of file diff --git a/test/diff/_drafts_rfc__search=name b/test/diff/_drafts_rfc__search_name similarity index 59% rename from test/diff/_drafts_rfc__search=name rename to test/diff/_drafts_rfc__search_name index cf2e0fc3b..d1aee882e 100644 --- a/test/diff/_drafts_rfc__search=name +++ b/test/diff/_drafts_rfc__search_name @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/idindex.cgi?command=show_list&cat=rfc&sort=name -+++ /drafts/rfc/?sort=name @@ -1123,0 +1123,1 @@ +draft-ietf-hubmib-etherif-MIB-06 1998-08-06 RFC 2358 I-D Exists @@ -1124,1 +1125,0 @@ diff --git a/test/diff/_idtracker_ b/test/diff/_idtracker_ index f85988e5e..153ce60be 100644 --- a/test/diff/_idtracker_ +++ b/test/diff/_idtracker_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/pidtracker.cgi -+++ /idtracker/ @@ -68,0 +68,1 @@ +--All Substates @@ -73,1 +74,0 @@ diff --git a/test/diff/_idtracker_12689_ b/test/diff/_idtracker_12689_ index 051a67c74..765cf7909 100644 --- a/test/diff/_idtracker_12689_ +++ b/test/diff/_idtracker_12689_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/pidtracker.cgi?command=view_id&dTag=12689&rfc_flag=0 -+++ /idtracker/12689/ @@ -40,2 +40,3 @@ -This draft is basically ready for publication, but has nits and more -... @@ -51,3 +49,7 @@ +> Definition of an IS-IS Link Attribute sub-TLV > > draft-ietf-isis- +link-attr-01.txt > > Abstract > > This document defines a sub-TLV +called "Link-attributes" carried > within the ... +@@ -140,3 +142,0 @@ +-Did you find a bug? Let us know. +-Any question or suggestion? +-This page produced by the IETF Secretariat for the IESG diff --git a/test/diff/_idtracker__search_group_acronym=&search_job_owner=0&search_rfcnumber=&search_status_id=&sub_state_id=6&search_cur_state=&search_button=SEARCH&search_filename=bgp-m&search_area_acronym= b/test/diff/_idtracker__search_group_acronym__search_job_owner_0_search_rfcnumber__search_status_id__sub_state_id_6_search_cur_state__search_button_SEARCH_search_filename_bgp-m_search_area_acronym_ similarity index 55% rename from test/diff/_idtracker__search_group_acronym=&search_job_owner=0&search_rfcnumber=&search_status_id=&sub_state_id=6&search_cur_state=&search_button=SEARCH&search_filename=bgp-m&search_area_acronym= rename to test/diff/_idtracker__search_group_acronym__search_job_owner_0_search_rfcnumber__search_status_id__sub_state_id_6_search_cur_state__search_button_SEARCH_search_filename_bgp-m_search_area_acronym_ index ce05771c6..aa6596559 100644 --- a/test/diff/_idtracker__search_group_acronym=&search_job_owner=0&search_rfcnumber=&search_status_id=&sub_state_id=6&search_cur_state=&search_button=SEARCH&search_filename=bgp-m&search_area_acronym= +++ b/test/diff/_idtracker__search_group_acronym__search_job_owner_0_search_rfcnumber__search_status_id__sub_state_id_6_search_cur_state__search_button_SEARCH_search_filename_bgp-m_search_area_acronym_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/pidtracker.cgi?command=search_list&search_job_owner=0&search_group_acronym=&search_status_id=&search_cur_state=&sub_state_id=6&search_filename=bgp-m&search_rfcnumber=&search_area_acronym=&search_button=SEARCH -+++ /idtracker/?search_group_acronym=&search_job_owner=0&search_rfcnumber=&search_status_id=&sub_state_id=6&search_cur_state=&search_button=SEARCH&search_filename=bgp-m&search_area_acronym= @@ -67,0 +67,1 @@ +--All Substates @@ -72,1 +73,0 @@ diff --git a/test/diff/_idtracker_ballot_1760_ b/test/diff/_idtracker_ballot_1760_ index cbbe621ce..2a3f0c0c9 100644 --- a/test/diff/_idtracker_ballot_1760_ +++ b/test/diff/_idtracker_ballot_1760_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/pidtracker.cgi?command=print_ballot&ballot_id=1760&filename=draft-ietf-isis-link-attr -+++ /idtracker/ballot/1760/ @@ -7,1 +7,1 @@ -https://datatracker.ietf.org/public/pidtracker.cgi?command=view_id&dTag=12689&rfc_flag=0 +https://datatracker.ietf.org/idtracker/ballot/1760/ diff --git a/test/diff/_idtracker_comment_65232_ b/test/diff/_idtracker_comment_65232_ index 5598b731d..06951ae5c 100644 --- a/test/diff/_idtracker_comment_65232_ +++ b/test/diff/_idtracker_comment_65232_ @@ -1,5 +1,5 @@ ---- https://datatracker.ietf.org/public/pidtracker.cgi?command=view_comment&id=65232 -+++ /idtracker/comment/65232/ -@@ -5,2 +5,0 @@ +@@ -3,0 +3,1 @@ ++Document: draft-ietf-isis-link-attr +@@ -5,2 +6,0 @@ -State before Comment: 0 --State after Comment: 0 \ No newline at end of file +-State after Comment: 0 diff --git a/test/diff/_idtracker_draft-ietf-isis-link-attr_ b/test/diff/_idtracker_draft-ietf-isis-link-attr_ index 4bd6c2897..765cf7909 100644 --- a/test/diff/_idtracker_draft-ietf-isis-link-attr_ +++ b/test/diff/_idtracker_draft-ietf-isis-link-attr_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/pidtracker.cgi?command=view_id&dTag=12689&rfc_flag=0 -+++ /idtracker/draft-ietf-isis-link-attr/ @@ -40,2 +40,3 @@ -This draft is basically ready for publication, but has nits and more -... @@ -51,3 +49,7 @@ +> Definition of an IS-IS Link Attribute sub-TLV > > draft-ietf-isis- +link-attr-01.txt > > Abstract > > This document defines a sub-TLV +called "Link-attributes" carried > within the ... +@@ -140,3 +142,0 @@ +-Did you find a bug? Let us know. +-Any question or suggestion? +-This page produced by the IETF Secretariat for the IESG diff --git a/test/diff/_idtracker_draft-ietf-isis-link-attr_comment_65232_ b/test/diff/_idtracker_draft-ietf-isis-link-attr_comment_65232_ index 6e599ed1c..06951ae5c 100644 --- a/test/diff/_idtracker_draft-ietf-isis-link-attr_comment_65232_ +++ b/test/diff/_idtracker_draft-ietf-isis-link-attr_comment_65232_ @@ -1,5 +1,5 @@ ---- https://datatracker.ietf.org/public/pidtracker.cgi?command=view_comment&id=65232 -+++ /idtracker/draft-ietf-isis-link-attr/comment/65232/ -@@ -5,2 +5,0 @@ +@@ -3,0 +3,1 @@ ++Document: draft-ietf-isis-link-attr +@@ -5,2 +6,0 @@ -State before Comment: 0 --State after Comment: 0 \ No newline at end of file +-State after Comment: 0 diff --git a/test/diff/_idtracker_rfc3847_ b/test/diff/_idtracker_rfc3847_ new file mode 100644 index 000000000..d55780649 --- /dev/null +++ b/test/diff/_idtracker_rfc3847_ @@ -0,0 +1,4 @@ +@@ -30,3 +30,0 @@ +-Did you find a bug? Let us know. +-Any question or suggestion? +-This page produced by the IETF Secretariat for the IESG diff --git a/test/diff/_iesg_ann_1563_ b/test/diff/_iesg_ann_1563_ index 8a36a7bab..582c9d9be 100644 --- a/test/diff/_iesg_ann_1563_ +++ b/test/diff/_iesg_ann_1563_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/previous_announcement.cgi?command=show_detail&ballot_id=1563 -+++ /iesg/ann/1563/ @@ -1,0 +1,7 @@ +IESG Announcement +This page contains an IESG Protocol, Document, or Working Group Action diff --git a/test/diff/_iesg_ann_2422_ b/test/diff/_iesg_ann_2422_ index 9bedfdd2c..9ae3ac813 100644 --- a/test/diff/_iesg_ann_2422_ +++ b/test/diff/_iesg_ann_2422_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/recent_announcement.cgi?command=show_detail&ballot_id=2422 -+++ /iesg/ann/2422/ @@ -1,0 +1,6 @@ +IESG Announcement +This page contains an IESG Protocol, Document, or Working Group Action diff --git a/test/diff/_iesg_ann_prev_ b/test/diff/_iesg_ann_prev_ index 720231f4f..0d27a01bb 100644 --- a/test/diff/_iesg_ann_prev_ +++ b/test/diff/_iesg_ann_prev_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/previous_announcement.cgi -+++ /iesg/ann/prev/ @@ -314,0 +314,1 @@ +Date Sent: April 4, 2002 @@ -468,1 +469,0 @@ diff --git a/test/diff/_ipr_ b/test/diff/_ipr_ index 4610322cc..ab8b74410 100644 --- a/test/diff/_ipr_ +++ b/test/diff/_ipr_ @@ -1,6 +1,4 @@ ---- https://datatracker.ietf.org/public/ipr_list.cgi -+++ /ipr/ -@@ -63,0 +63,1 @@ -+2000-09-15 170 i-DNS.net International general License statement -@@ -66,1 +67,0 @@ --0000-09-15 170 i-DNS.net International general License statement \ No newline at end of file +@@ -22,0 +22,1 @@ ++2007-06-26 859 QUALCOMM Incorporated's General License Statement +@@ -1362,1 +1363,0 @@ +-Please report any problems to ietf-act ion@ietf.org diff --git a/test/diff/_ipr_ipr-657_ b/test/diff/_ipr_657_ similarity index 79% rename from test/diff/_ipr_ipr-657_ rename to test/diff/_ipr_657_ index 83aaba791..9943fb1f5 100644 --- a/test/diff/_ipr_ipr-657_ +++ b/test/diff/_ipr_657_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=657 -+++ /ipr/ipr-657/ @@ -43,3 +43,4 @@ -Licensing information, comments, notes, or URL for further information -: diff --git a/test/diff/_ipr_ipr-795_ b/test/diff/_ipr_795_ similarity index 80% rename from test/diff/_ipr_ipr-795_ rename to test/diff/_ipr_795_ index 4393c85c8..184842b35 100644 --- a/test/diff/_ipr_ipr-795_ +++ b/test/diff/_ipr_795_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=795 -+++ /ipr/ipr-795/ @@ -23,4 +23,2 @@ -Relates -Title: diff --git a/test/diff/_ipr_ipr-834_ b/test/diff/_ipr_834_ similarity index 85% rename from test/diff/_ipr_ipr-834_ rename to test/diff/_ipr_834_ index 4c41b2c1d..1f001e6cb 100644 --- a/test/diff/_ipr_ipr-834_ +++ b/test/diff/_ipr_834_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_detail_show.cgi?&ipr_id=834 -+++ /ipr/ipr-834/ @@ -30,4 +30,2 @@ -Relates -Title: diff --git a/test/diff/_ipr_about_ b/test/diff/_ipr_about_ index 39e92cd75..0feac8d10 100644 --- a/test/diff/_ipr_about_ +++ b/test/diff/_ipr_about_ @@ -1,7 +1,6 @@ ---- https://datatracker.ietf.org/public/ipr_disclosure.cgi -+++ /ipr/about/ -@@ -5,2 +5,2 @@ --Technology" (updated by RFC4879, "Clarification of the Thrid Party --Disclosure Procedure in RFC3979".) +@@ -5,1 +5,2 @@ +-Technology". +Technology" (updated by RFC4879, "Clarification of the Third Party -+Disclosure Procedure in RFC3979"). \ No newline at end of file ++Disclosure Procedure in RFC3979"). +@@ -50,1 +51,0 @@ +-Please report any problems to ietf-action@ietf.org diff --git a/test/diff/_ipr_new-generic_ b/test/diff/_ipr_new-generic_ index 3dfd91b25..2d586c75a 100644 --- a/test/diff/_ipr_new-generic_ +++ b/test/diff/_ipr_new-generic_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_generic.cgi -+++ /ipr/new-generic/ @@ -9,1 +9,1 @@ -Note: According to Section 6.4.3 ofRFC3979, "Intellectual Property +Note: According to Section 6.4.3 of RFC3979, "Intellectual Property diff --git a/test/diff/_ipr_new-specific_ b/test/diff/_ipr_new-specific_ index 8144aede0..ee5a80fb5 100644 --- a/test/diff/_ipr_new-specific_ +++ b/test/diff/_ipr_new-specific_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr.cgi -+++ /ipr/new-specific/ @@ -16,0 +16,1 @@ +Fields marked with * are required. @@ -17,2 +18,2 @@ diff --git a/test/diff/_ipr_new-third-party_ b/test/diff/_ipr_new-third-party_ index 8be796bba..e581c9b64 100644 --- a/test/diff/_ipr_new-third-party_ +++ b/test/diff/_ipr_new-third-party_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_notify.cgi -+++ /ipr/new-third-party/ @@ -10,1 +10,1 @@ -it to ietf-ipr@ietf.org.Submissions made by e-mail that do not comply +it to ietf-ipr@ietf.org. Submissions made by e-mail that do not comply diff --git a/test/diff/_ipr_search__option=title_search&title_search=AAAxz b/test/diff/_ipr_search__option=title_search&title_search=AAAxz deleted file mode 100644 index 9ce88a531..000000000 --- a/test/diff/_ipr_search__option=title_search&title_search=AAAxz +++ /dev/null @@ -1,6 +0,0 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=title_search&title_search=AAAxz -+++ /ipr/search/?option=title_search&title_search=AAAxz -@@ -1,0 +1,1 @@ -+IPR Disclosure Page -@@ -2,0 +3,1 @@ -+IPR Search Main Page \ No newline at end of file diff --git a/test/diff/_ipr_search__option=document_search&id_document_tag=2220 b/test/diff/_ipr_search__option_document_search_id_document_tag_2220 similarity index 85% rename from test/diff/_ipr_search__option=document_search&id_document_tag=2220 rename to test/diff/_ipr_search__option_document_search_id_document_tag_2220 index 15e1780e8..d31f26ec7 100644 --- a/test/diff/_ipr_search__option=document_search&id_document_tag=2220 +++ b/test/diff/_ipr_search__option_document_search_id_document_tag_2220 @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=document_search&id_document_tag=2220 -+++ /ipr/search/?option=document_search&id_document_tag=2220 @@ -52,0 +52,6 @@ +Search result on draft-ietf-mobileip-protocol, "IP Mobility Support", +that was published as RFC2002, "IP Mobility Support" diff --git a/test/diff/_ipr_search__option=ipr_title_search&ipr_title_search=nortel b/test/diff/_ipr_search__option_ipr_title_search_ipr_title_search_nortel similarity index 66% rename from test/diff/_ipr_search__option=ipr_title_search&ipr_title_search=nortel rename to test/diff/_ipr_search__option_ipr_title_search_ipr_title_search_nortel index 4096717b7..6a7c5ca13 100644 --- a/test/diff/_ipr_search__option=ipr_title_search&ipr_title_search=nortel +++ b/test/diff/_ipr_search__option_ipr_title_search_ipr_title_search_nortel @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=ipr_title_search&ipr_title_search=nortel -+++ /ipr/search/?option=ipr_title_search&ipr_title_search=nortel @@ -211,2 +211,2 @@ -IPR that has word(s) "nortel" in the title, and is not related to a -specific IETF contribution. diff --git a/test/diff/_ipr_search__option=ipr_title_search&ipr_title_search=nortelxz b/test/diff/_ipr_search__option_ipr_title_search_ipr_title_search_nortelxz similarity index 52% rename from test/diff/_ipr_search__option=ipr_title_search&ipr_title_search=nortelxz rename to test/diff/_ipr_search__option_ipr_title_search_ipr_title_search_nortelxz index 81c4174fc..e1f3fc4b4 100644 --- a/test/diff/_ipr_search__option=ipr_title_search&ipr_title_search=nortelxz +++ b/test/diff/_ipr_search__option_ipr_title_search_ipr_title_search_nortelxz @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=ipr_title_search&ipr_title_search=nortelxz -+++ /ipr/search/?option=ipr_title_search&ipr_title_search=nortelxz @@ -2,3 +2,4 @@ -Search result on "nortelxz" -No IPR disclosures with the word(s)"nortelxz" in the title have been diff --git a/test/diff/_ipr_search__option=rfc_search&rfc_search=1034 b/test/diff/_ipr_search__option_rfc_search_rfc_search_1034 similarity index 94% rename from test/diff/_ipr_search__option=rfc_search&rfc_search=1034 rename to test/diff/_ipr_search__option_rfc_search_rfc_search_1034 index 523dd3e4b..b87e0c24c 100644 --- a/test/diff/_ipr_search__option=rfc_search&rfc_search=1034 +++ b/test/diff/_ipr_search__option_rfc_search_rfc_search_1034 @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=rfc_search&rfc_search=1034 -+++ /ipr/search/?option=rfc_search&rfc_search=1034 @@ -148,1 +148,1 @@ -Search result on RFC1035, "Domain names - implementation and specification", that was updated by RFC3658, "Delegation Signer Resource Record" +Search result on RFC1035, "Domain names - implementation and specification", that was updated by RFC4033, "DNS Security Introduction and Requirements" diff --git a/test/diff/_ipr_search__option_title_search_title_search_AAAxz b/test/diff/_ipr_search__option_title_search_title_search_AAAxz new file mode 100644 index 000000000..14570cd31 --- /dev/null +++ b/test/diff/_ipr_search__option_title_search_title_search_AAAxz @@ -0,0 +1,4 @@ +@@ -1,0 +1,1 @@ ++IPR Disclosure Page +@@ -2,0 +3,1 @@ ++IPR Search Main Page \ No newline at end of file diff --git a/test/diff/_ipr_search__patent_info_search=12&option=patent_info_search b/test/diff/_ipr_search__patent_info_search=12&option=patent_info_search deleted file mode 100644 index cead7c446..000000000 --- a/test/diff/_ipr_search__patent_info_search=12&option=patent_info_search +++ /dev/null @@ -1,4 +0,0 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=12 -+++ /ipr/search/?patent_info_search=12&option=patent_info_search -@@ -4,1 +4,1 @@ --Please send problem reports to ietf-action@ietf.org. \ No newline at end of file diff --git a/test/diff/_ipr_search__patent_info_search=31415&option=patent_info_search b/test/diff/_ipr_search__patent_info_search=31415&option=patent_info_search deleted file mode 100644 index f0206637b..000000000 --- a/test/diff/_ipr_search__patent_info_search=31415&option=patent_info_search +++ /dev/null @@ -1,6 +0,0 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=31415 -+++ /ipr/search/?patent_info_search=31415&option=patent_info_search -@@ -1,0 +1,1 @@ -+IPR Disclosure Page -@@ -2,0 +3,1 @@ -+IPR Search Main Page \ No newline at end of file diff --git a/test/diff/_ipr_search__patent_info_search=abc&option=patent_info_search b/test/diff/_ipr_search__patent_info_search=abc&option=patent_info_search deleted file mode 100644 index fb0fd7294..000000000 --- a/test/diff/_ipr_search__patent_info_search=abc&option=patent_info_search +++ /dev/null @@ -1,5 +0,0 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_info_search&patent_info_search=abc -+++ /ipr/search/?patent_info_search=abc&option=patent_info_search -@@ -3,1 +3,1 @@ --The search string must contain at lease one digit -+The search string must contain at least one digit \ No newline at end of file diff --git a/test/diff/_ipr_search__patent_info_search_12_option_patent_info_search b/test/diff/_ipr_search__patent_info_search_12_option_patent_info_search new file mode 100644 index 000000000..4529e1208 --- /dev/null +++ b/test/diff/_ipr_search__patent_info_search_12_option_patent_info_search @@ -0,0 +1,2 @@ +@@ -4,1 +4,1 @@ +-Please send problem reports to ietf-action@ietf.org. \ No newline at end of file diff --git a/test/diff/_ipr_search__patent_info_search_31415_option_patent_info_search b/test/diff/_ipr_search__patent_info_search_31415_option_patent_info_search new file mode 100644 index 000000000..14570cd31 --- /dev/null +++ b/test/diff/_ipr_search__patent_info_search_31415_option_patent_info_search @@ -0,0 +1,4 @@ +@@ -1,0 +1,1 @@ ++IPR Disclosure Page +@@ -2,0 +3,1 @@ ++IPR Search Main Page \ No newline at end of file diff --git a/test/diff/_ipr_search__patent_info_search_abc_option_patent_info_search b/test/diff/_ipr_search__patent_info_search_abc_option_patent_info_search new file mode 100644 index 000000000..f1d6d3c6c --- /dev/null +++ b/test/diff/_ipr_search__patent_info_search_abc_option_patent_info_search @@ -0,0 +1,3 @@ +@@ -3,1 +3,1 @@ +-The search string must contain at lease one digit ++The search string must contain at least one digit \ No newline at end of file diff --git a/test/diff/_ipr_search__patent_search=nortelxz&option=patent_search b/test/diff/_ipr_search__patent_search=nortelxz&option=patent_search deleted file mode 100644 index 407491af1..000000000 --- a/test/diff/_ipr_search__patent_search=nortelxz&option=patent_search +++ /dev/null @@ -1,4 +0,0 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=patent_search&patent_search=nortelxz -+++ /ipr/search/?patent_search=nortelxz&option=patent_search -@@ -4,0 +4,1 @@ -+IPR Search Main Page IPR Disclosure Page \ No newline at end of file diff --git a/test/diff/_ipr_search__patent_search_nortelxz_option_patent_search b/test/diff/_ipr_search__patent_search_nortelxz_option_patent_search new file mode 100644 index 000000000..362d66d87 --- /dev/null +++ b/test/diff/_ipr_search__patent_search_nortelxz_option_patent_search @@ -0,0 +1,2 @@ +@@ -4,0 +4,1 @@ ++IPR Search Main Page IPR Disclosure Page \ No newline at end of file diff --git a/test/diff/_ipr_search__rfc_search=1034&option=rfc_search b/test/diff/_ipr_search__rfc_search_1034_option_rfc_search similarity index 94% rename from test/diff/_ipr_search__rfc_search=1034&option=rfc_search rename to test/diff/_ipr_search__rfc_search_1034_option_rfc_search index 04ce96ec0..93d2dff21 100644 --- a/test/diff/_ipr_search__rfc_search=1034&option=rfc_search +++ b/test/diff/_ipr_search__rfc_search_1034_option_rfc_search @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_search.cgi?option=rfc_search&rfc_search=1034 -+++ /ipr/search/?rfc_search=1034&option=rfc_search @@ -149,1 +149,1 @@ -Search result on RFC1035, "Domain names - implementation and specification", that was updated by RFC3658, "Delegation Signer Resource Record" +Search result on RFC1035, "Domain names - implementation and specification", that was updated by RFC4033, "DNS Security Introduction and Requirements" diff --git a/test/diff/_ipr_update_ b/test/diff/_ipr_update_ index 8a3336f9b..85ef3c237 100644 --- a/test/diff/_ipr_update_ +++ b/test/diff/_ipr_update_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/ipr_update_list.cgi -+++ /ipr/update/ @@ -55,0 +55,1 @@ +2000-09-15 170 i-DNS.net International general License statement @@ -58,1 +59,0 @@ diff --git a/test/diff/_ipr_update_657_ b/test/diff/_ipr_update_657_ index 849aa6cf4..14dfea0c3 100644 --- a/test/diff/_ipr_update_657_ +++ b/test/diff/_ipr_update_657_ @@ -1,13 +1,9 @@ ---- https://datatracker.ietf.org/public/ipr_generic.cgi?command=update_ipr&ipr_id=657 -+++ /ipr/update/657/ -@@ -1,3 +1,1 @@ --Updating Generic IPR Disclosures France Telecom SA's general license --statement (2) +@@ -3,1 +3,1 @@ -Contact Information for Submitter of this Update. (Required field* ) +Contact Information for Submitter of this Update. -@@ -7,1 +5,1 @@ +@@ -7,1 +7,1 @@ -Address1: * +Address1: -@@ -12,1 +10,1 @@ +@@ -12,1 +12,1 @@ -I am authorized to update this IPR disclosure, and I understand that -+* I am authorized to update this IPR disclosure, and I understand that \ No newline at end of file ++* I am authorized to update this IPR disclosure, and I understand that diff --git a/test/diff/_ipr_update_820_ b/test/diff/_ipr_update_820_ new file mode 100644 index 000000000..b582aa27b --- /dev/null +++ b/test/diff/_ipr_update_820_ @@ -0,0 +1,15 @@ +@@ -1,4 +1,4 @@ +-Updating Notification Eric Rescorla's statement about possible IPR +-claimed in draft- rescorla-stateless-tokens-01.txt belonging to +-Hewlett Packard +-Contact Information for Submitter of this Update. (Required field* ) ++Updating Third-Party IPR Disclosures Eric Rescorla's statement about ++possible IPR claimed in draft- rescorla-stateless-tokens-01.txt ++belonging to Hewlett Packard ++Contact Information for Submitter of this Update. +@@ -8,1 +8,1 @@ +-Address1: * ++Address1: +@@ -13,1 +13,1 @@ +-I am authorized to update this IPR disclosure, and I understand that ++* I am authorized to update this IPR disclosure, and I understand that diff --git a/test/diff/_ipr_update_844_ b/test/diff/_ipr_update_844_ new file mode 100644 index 000000000..14dfea0c3 --- /dev/null +++ b/test/diff/_ipr_update_844_ @@ -0,0 +1,9 @@ +@@ -3,1 +3,1 @@ +-Contact Information for Submitter of this Update. (Required field* ) ++Contact Information for Submitter of this Update. +@@ -7,1 +7,1 @@ +-Address1: * ++Address1: +@@ -12,1 +12,1 @@ +-I am authorized to update this IPR disclosure, and I understand that ++* I am authorized to update this IPR disclosure, and I understand that diff --git a/test/diff/_liaison_ b/test/diff/_liaison_ index 1a611607c..cc6c7830c 100644 --- a/test/diff/_liaison_ +++ b/test/diff/_liaison_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/liaisons.cgi -+++ /liaison/ @@ -7,1 +7,1 @@ -“VCAT/LCAS Work in CCAMP” +“VCAT/LCAS Work in CCAMPâ€? diff --git a/test/diff/_liaison_321_ b/test/diff/_liaison_321_ index 66ef65948..b31847a92 100644 --- a/test/diff/_liaison_321_ +++ b/test/diff/_liaison_321_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/liaison_detail.cgi?detail_id=321 -+++ /liaison/321/ @@ -8,1 +8,1 @@ -IETF CCAMP WG (adrian@olddog.co.uk,dbrungard@att.com) +IETF CCAMP WG (adrian@olddog.co.uk, dbrungard@att.com) diff --git a/test/diff/_list_approve_20A0p492qbq04067_ b/test/diff/_list_approve_20A0p492qbq04067_ index aa41369da..47a8e74c8 100644 --- a/test/diff/_list_approve_20A0p492qbq04067_ +++ b/test/diff/_list_approve_20A0p492qbq04067_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/request_area_confirm.cgi?mailing_list_id=20A0p492qbq04067 -+++ /list/approve/20A0p492qbq04067/ @@ -1,1 +1,1 @@ -Request to move a WG email list to ietf.org +Request to move the WG email list for ietf-acap+ to ietf.org diff --git a/test/diff/_list_area_ b/test/diff/_list_area_ index feddbc91a..5056fa3dd 100644 --- a/test/diff/_list_area_ +++ b/test/diff/_list_area_ @@ -1,4 +1,2 @@ ---- https://datatracker.ietf.org/public/area_mailing_list.cgi -+++ /list/area/ @@ -1,0 +1,1 @@ + diff --git a/test/diff/_list_nonwg_ b/test/diff/_list_nonwg_ index d6fb10ed6..f0f3b6732 100644 --- a/test/diff/_list_nonwg_ +++ b/test/diff/_list_nonwg_ @@ -1,5 +1,3 @@ ---- https://datatracker.ietf.org/public/nwg_list.cgi -+++ /list/nonwg/ @@ -23,2 +23,2 @@ -with a WebDAV-based protocol, and to progress it ... app -http://lists.osafoundation.org/mailman/listinfo/ietf-caldav diff --git a/test/diff/_list_nonwg_update_ b/test/diff/_list_nonwg_update_ new file mode 100644 index 000000000..ccd0ccb70 --- /dev/null +++ b/test/diff/_list_nonwg_update_ @@ -0,0 +1,8 @@ +@@ -38,1 +38,0 @@ +-Messaging -- discussion of messaging protocols +@@ -63,0 +62,1 @@ ++vCard and CardDAV +@@ -99,1 +99,0 @@ +-Messaging -- discussion of messaging protocols +@@ -124,0 +123,1 @@ ++vCard and CardDAV diff --git a/test/diff/_list_request_ b/test/diff/_list_request_ index 61d238538..2a2cbcdb4 100644 --- a/test/diff/_list_request_ +++ b/test/diff/_list_request_ @@ -1,4 +1,2 @@ ---- https://datatracker.ietf.org/public/request_list.cgi -+++ /list/request/ @@ -1,0 +1,1 @@ +Step 1: diff --git a/test/diff/_meeting_68_agenda.txt_ b/test/diff/_meeting_68_agenda.txt_ deleted file mode 100644 index ebb4d6ac5..000000000 --- a/test/diff/_meeting_68_agenda.txt_ +++ /dev/null @@ -1,101 +0,0 @@ ---- https://datatracker.ietf.org/public/meeting_agenda_text.cgi?meeting_num=68 -+++ /meeting/68/agenda.txt -@@ -3,1 +3,1 @@ --Updated as of June 19, 2007, 14:34:55 -+Updated As of: June 19, 2007 8:34 p.m. (CEST) -@@ -7,0 +7,1 @@ -+1300-1445 Newcomer's Training - Congress I -@@ -15,1 +16,1 @@ --0800-0900 Continental Breakfast - Congress Hall Foyer -+0800-0900 Morning Beverages - Congress Hall Foyer -@@ -33,1 +34,1 @@ --1500-1520 Afternoon Refreshment Break - Congress Hall Foyer -+1500-1520 Afternoon Beverage and Snack Break I -@@ -42,1 +43,1 @@ --1720-1740 Afternoon Refreshment Break - Congress Hall Foyer -+1720-1740 Afternoon Beverage and Snack Break II -@@ -54,1 +55,1 @@ --0800-0900 Continental Breakfast - Congress Hall Foyer -+0800-0900 Morning Beverages - Congress Hall Foyer -@@ -59,1 +60,1 @@ --Congress I RAI speermint Session PEERing for Multimedia INTerconnect WG - moved from Thursday at 0900 -+Congress I RAI speermint Session PEERing for Multimedia INTerconnect WG - MOVED FROM THURSDAY AT 0900 -@@ -65,0 +66,1 @@ -+Congress II INT mipshop Mobility for IP: Performance, Signaling and Handoff Optimization WG -@@ -66,1 +68,0 @@ --Congress II INT mipshop Mobility for IP: Performance, Signaling and Handoff Optimization WG -@@ -72,1 +73,1 @@ --1500-1520 Afternoon Refreshment Break - Congress Hall Foyer -+1500-1520 Afternoon Beverage and Snack Break I -@@ -82,1 +83,1 @@ --1720-1740 Afternoon Refreshment Break - Congress Hall Foyer -+1720-1740 Afternoon Beverage and Snack Break II -@@ -92,0 +93,2 @@ -+Congress II INT nemo Network Mobility WG -+Karlin I INT ipdvb IP over DVB WG -@@ -93,2 +96,0 @@ --Karlin I INT ipdvb IP over DVB WG --Congress II INT nemo Network Mobility WG -@@ -101,1 +102,1 @@ --0800-0900 Continental Breakfast - Congress Hall Foyer -+0800-0900 Morning Beverages - Congress Hall Foyer -@@ -108,0 +109,1 @@ -+Grand Ballroom SEC ifare IPsec FAilover and REdundancy BOF -@@ -109,1 +111,0 @@ --Grand Ballroom SEC ifare IPsec FAilover and REdundancy BOF -@@ -119,0 +120,1 @@ -+Grand Ballroom TSV rmt Reliable Multicast Transport WG -@@ -120,1 +122,1 @@ --Grand Ballroom TSV rmt Reliable Multicast Transport WG -+Afternoon Beverage and Snack Break I -@@ -128,1 +130,0 @@ --1610-1700 Afternoon Refreshment Break - Congress Hall Foyer -@@ -130,18 +131,4 @@ --Roma/Vienna/Madrid 0 pgp PGP Key Signing --1700-1930 IETF Operations and Administration Plenary - Congress I - III --Part 1: IAOC/IESG plenary --17:00 Welcome --17:05 NOC report --17:10 Host presentation (Mark Foster, CTO, Neustar) --17:20 IETF Chair and IAD short reports --17:30 NomCom Chair (Andrew Lange) --17:35 Introduce new IESG and IAOC members --17:45 IAOC Q&A; --18:00 IESG Q&A; --Part 2: Special plenary (Internet and Routing ADs) --18:30 ROAP (ROuting and Addressing Problem) status report --See http://www.arkko.com/ietf/ietf-68/ietf68_roap_agenda.txt --- Report on where we are with this problem and what --the IETF can and intends to do about it. --- Open discussion --19:30 (end) -+Roma/Vienna/Madrid ZTRAIN pgp PGP Key Signing -+1700-1930 IETF Operations and Administration Plenary -+Congress I - III -+THE AGENDA HAS NOT BEEN UPLOADED YET -@@ -150,1 +137,1 @@ --0800-0900 Continental Breakfast - Congress Hall Foyer -+0800-0900 Morning Beverages - Congress Hall Foyer -@@ -154,1 +141,1 @@ --Roma/Vienna/Madrid IRTF MobOpts IP Mobility Optimizations Research Group - Date Change -+Roma/Vienna/Madrid IRTF mobopts IP Mobility Optimizations Research Group - DATE CHANGE -@@ -156,1 +143,1 @@ --Congress I RAI geopriv Geographic Location/Privacy WG - moved from Tuesday at 0900 -+Congress I RAI geopriv Geographic Location/Privacy WG - MOVED FROM TUESDAY AT 0900 -@@ -163,0 +150,1 @@ -+Congress I RAI simple SIP for Instant Messaging and Presence Leveraging Extensions WG -@@ -164,1 +152,0 @@ --Congress I RAI simple SIP for Instant Messaging and Presence Leveraging Extensions WG -@@ -168,0 +155,1 @@ -+Afternoon Beverage and Snack Break I -@@ -173,1 +161,0 @@ --Congress I RAI ecrit Emergency Context Resolution with Internet Technologies WG -@@ -177,9 +164,3 @@ --1610-1700 Afternoon Refreshment Break - Congress Hall Foyer --1700-1930 Technical Plenary - Congress I - III --Welcome and introduction --IAB update --IRTF Report (Aaron Falk + NMRG RG Chair(s)) --Technical Discussion: Internationalization Technical Discussion --Technical presentations -... (skipping 26 lines of diff) diff --git a/test/diff/_meeting_69_materials.html_ b/test/diff/_meeting_69_materials.html_ deleted file mode 100644 index f1a464311..000000000 --- a/test/diff/_meeting_69_materials.html_ +++ /dev/null @@ -1,29 +0,0 @@ ---- https://datatracker.ietf.org/public/meeting_materials.cgi?meeting_num=69 -+++ /meeting/69/materials.html -@@ -1,0 +1,1 @@ -+Server mode: -@@ -2,1 +3,1 @@ --Updated as of June 19, 2007, 14:35:1 -+Updated as of June 19, 2007, 8:34 p.m. (CEST) -@@ -4,2 +5,0 @@ --PLENARYW [Agenda] --No presentation files, agenda received, no minutes -@@ -207,0 +206,8 @@ -+HIPRG -+No presentation files, no agenda, no minutes -+MOBOPTS -+No presentation files, no agenda, no minutes -+RRG -+No presentation files, no agenda, no minutes -+SAMRG -+No presentation files, no agenda, no minutes -@@ -209,2 +216,0 @@ --HIPRG --No presentation files, no agenda, no minutes -@@ -213,6 +218,0 @@ --MOBOPTS --No presentation files, no agenda, no minutes --RRG --No presentation files, no agenda, no minutes --SAMRG --No presentation files, no agenda, no minutes diff --git a/test/ignore/date/mon_day_year_time.regex b/test/ignore/date/mon_day_year_time.regex index 1fdc47a8a..b0218d98d 100644 --- a/test/ignore/date/mon_day_year_time.regex +++ b/test/ignore/date/mon_day_year_time.regex @@ -1 +1 @@ -(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d, [12]0\d\d, \d\d?:\d\d?:\d\d?( \([A-Z]+\))? \ No newline at end of file +(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d?, [12]0\d\d, \d\d?:\d\d?:\d\d?( \([A-Z]+\))? \ No newline at end of file diff --git a/test/ignore/date/month_day_year_time.regex b/test/ignore/date/month_day_year_time.regex index d28f047cb..51c03a3e7 100644 --- a/test/ignore/date/month_day_year_time.regex +++ b/test/ignore/date/month_day_year_time.regex @@ -1 +1 @@ -(January|February|March|April|May|June|July|August|September|October|November|December) \d\d, [12]0\d\d, \d\d?:\d\d?:\d\d?( \([A-Z]+\))? \ No newline at end of file +(January|February|March|April|May|June|July|August|September|October|November|December) \d\d?, [12]0\d\d, \d\d?:\d\d?:\d\d?( \([A-Z]+\))? \ No newline at end of file diff --git a/test/mkrelease b/test/mkrelease index d3657eb87..3b07715b6 100755 --- a/test/mkrelease +++ b/test/mkrelease @@ -74,13 +74,14 @@ trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; # Option parsing # Options -shortopts=hpvV -longopts=help,repository,verbose,version +shortopts=hnvV +longopts=help,dry-run,verbose,version # Default values MSG="" VERFILE=ietf/__init__.py SETTINGS=ietf/settings.py +do="" if [ "$(uname)" = "Linux" ]; then args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@") @@ -99,6 +100,7 @@ while true ; do case "$1" in -h| --help) usage; exit;; # Show this help, then exit -m| --message) MSG=$2; shift;; # Specify a commit message + -n| --dry-run) do="echo";; # Show what would be done -v| --verbose) VERBOSE=1;; # Be more talkative -V| --version) version; exit;; # Show program version, then exit --) shift; break;; @@ -132,14 +134,20 @@ elif [ "${DIR%%/*}" = "branch" ]; then SRC="branch/${tmp%%/*}" # keep first subdir under branch/ fi +note "" +note "Releasing from $SRC" + note "Locating the root of the working copy..." -while [ "$RDIR" ]; do - [ "$RDIR" = "$prev" ] && die "Internal error" +while [ "${#DIR}" -gt "${#SRC}" ]; do + [ "$DIR" = "$prev" ] && die "Internal error" cd .. note " now at $PWD" - prev=$RDIR - RDIR=${RDIR%/*} + prev=$DIR + DIR=${DIR%/*} done +if [ "$DIR" != "$SRC" ]; then + die "Couldn't find the root of your '$SRC' working copy" +fi REPO=${REPO%/} # remove trailing slash SRC=${SRC#/} # remove leading slash @@ -150,50 +158,57 @@ VER="$(printf %d.%02d $MAJOR $MINOR)" NEXT=$(( $MINOR + 1 )) DEV="$(printf %d.%02d-dev $MAJOR $NEXT)" -note "Verifying that the version doesn't already exist" + +note "Verifying that version $VER doesn't already exist..." svn info $REPO/tags/$VER 2>&1 | grep -q "Not a valid URL" || die "The tag '$VER' already exists (or there was an error testing for it)." +note " Ok" -note "Update the version info in $VERFILE and make sure'\$Rev\$' is Ok" -sed -i -r -e "/^__version__/s/\"[.0-9]+(-dev)?\"/\"$VER\"/" \ +note "Verifying there's no uncommitted changes..." +$do svn st | grep "^[AMGRD] " && die "There seems to be uncommitted changes in this working copy" + +note "\nUpdating the version info in $VERFILE and making sure'\$Rev\$' is Ok" +$do sed -i -r -e "/^__version__/s/\"[.0-9]+(-dev)?\"/\"$VER\"/" \ -e "/^__rev__/s/\".*\"/\"\$Rev:\$\"/" \ - $SRC/$VERFILE + $VERFILE -note "Update the deployment settings in settings.py" -sed -i -r -e 's/^DEBUG *= *.*$/DEBUG = False/' \ - -e "s/^SERVER_MODE *= *.*\$/SERVER_MODE = 'production'/" \ - $SRC/$SETTINGS +note "\nUpdating the deployment settings in settings.py" +$do sed -i -r -e 's/^DEBUG *= *.*$/DEBUG = False/' \ + -e "s/^SERVER_MODE *= *.*\$/SERVER_MODE = 'production'/" \ + $SETTINGS -note "Committing version information for version $VER. $MSG" -svn commit $SRC/$VERFILE $SRC/$SETTINGS -m "Set version info to release version $VER before branching. $MSG" +note "\nCommitting version information for version $VER: $MSG" +$do svn commit $VERFILE $SETTINGS -m "Set version info to release version $VER before branching. $MSG" -note "Creating new tag 'tags/$VER' from $SRC" -svn cp $REPO/$SRC $REPO/tags/$VER -m "Creating new tag 'tags/$VER' from $SRC" +note "\nCreating new tag 'tags/$VER' from $SRC" +$do svn cp $REPO/$SRC $REPO/tags/$VER -m "Creating new tag 'tags/$VER' from $SRC" -note "Updating version and revision info to indicate that the source and branch aren't releases" -sed -i -r -e "/^__version__/s/\"[0-9.]*\"/\"$DEV\"/" \ - -e "/^__rev__/s/\"\\\$Rev: (.*) \\\$\"/\"\$Rev:\$ (dev) Latest release: Rev. \1 \"/" \ - $SRC/$VERFILE +note "\nUpdating version and revision info to indicate that the source and branch aren't releases" +$do sed -i -r -e "/^__version__/s/\"[0-9.]*\"/\"$DEV\"/" \ + -e "/^__rev__/s/\"\\\$Rev: (.*) \\\$\"/\"\$Rev:\$ (dev) Latest release: Rev. \1 \"/" \ + $VERFILE -note "Updating the deployment settings in settings.py to development mode" -sed -i -r -e 's/^DEBUG *= *.*$/DEBUG = True/' \ - -e "s/^SERVER_MODE *= *.*\$/SERVER_MODE = 'development'/" \ - $SRC/$SETTINGS +note "\nUpdating the deployment settings in settings.py to development mode" +$do sed -i -r -e 's/^DEBUG *= *.*$/DEBUG = True/' \ + -e "s/^SERVER_MODE *= *.*\$/SERVER_MODE = 'development'/" \ + $SETTINGS +note "\nCommitting the updated version and deployment settings" +$do svn commit $VERFILE $SETTINGS -m "Set version info and settings back to development mode" # if SRC is 'trunk', then also create a new branch if [ $SRC = "trunk" ]; then if svn info $REPO/branch/$VER 2>&1 | grep -q "Not a valid URL"; then - note "Creating new branch 'branch/$VER' from $SRC" - svn cp $REPO/$SRC $REPO/branch/$VER -m "Creating new branch 'branch/$VER' from $SRC" + note "\nCreating new branch 'branch/$VER' from $SRC" + $do svn cp $REPO/$SRC $REPO/branch/$VER -m "Creating new branch 'branch/$VER' from $SRC" fi - note "Updating version and revision info on trunk" - sed -i -r -e "/^__version__/s/\"[0-9.]*\"/\"$MAJOR.xx-trunk\"/" \ - -e "/^__rev__/s/\"\\\$Rev: (.*) \\\$\"/\"\$Rev:\$ (dev) Latest release: Rev. \1 \"/" \ - $SRC/$VERFILE + note "\nUpdating version and revision info on trunk" + $do sed -i -r -e "/^__version__/s/\"[0-9.]*\"/\"$MAJOR.xx-trunk\"/" \ + -e "/^__rev__/s/\"\\\$Rev: (.*) \\\$\"/\"\$Rev:\$ (dev) Latest release: Rev. \1 \"/" \ + $VERFILE note "Commit version information '$MAJOR.xx-trunk'" - svn commit $SRC/$VERFILE $SRC/$SETTINGS -m "Set version of the trunk to $MAJOR.xx-trunk after branching off $VER" + $do svn commit $VERFILE $SETTINGS -m "Set version of the trunk to $MAJOR.xx-trunk after branching off $VER" fi -svn update +$do svn update diff --git a/test/pyflakes.exclude b/test/pyflakes.exclude index e88d98dec..a39b6ca43 100644 --- a/test/pyflakes.exclude +++ b/test/pyflakes.exclude @@ -14,6 +14,7 @@ ietf/utils/__init__.py:2: 'log' imported but unused ietf/utils/__init__.py:3: 'FKAsOneToOne' imported but unused ietf/utils/__init__.py:5: 'TextSoup' imported but unused ietf/utils/__init__.py:5: 'soup2text' imported but unused +ietf/utils/__init__.py:8: 'normalize_draftname' imported but unused ietf/idtracker/templatetags/ietf_filters.py:8: redefinition of unused 'emailutils' from line 6 ietf/contrib/BeautifulSoup.py:59: redefinition of unused 'name2codepoint' from line 57 ietf/contrib/BeautifulSoup.py:1497: redefinition of unused 'chardet' from line 1493 diff --git a/test/run b/test/run index 05ebc96f0..38c3bfc0b 100755 --- a/test/run +++ b/test/run @@ -3,9 +3,12 @@ program=${0##*/} progdir=${0%/*} +. $progdir/shell-utils + cd $progdir/.. # now at trunk/ -test/test-setup # create a patched django for test purposes, and more +pidfile=$(test/test-setup) # create a patched django for test purposes, and more +[ "$pidfile" ] || die "Didn't get a pidfile name" test/run-pyflakes ietf @@ -13,7 +16,10 @@ test/run-pyflakes ietf trap 'echo "$program($LINENO): Caught Interrupt"' INT # run tests with our patched django -PYTHONPATH=test:test/lib URLPREFIX="$*" python ietf/manage.py test +PYTHONPATH=test:test/lib URLPREFIX="$*" python ietf/manage.py test & +pid=$! +echo $pid > $pidfile +wait $pid # reset keyboard interrupt trap trap INT diff --git a/test/shell-utils b/test/shell-utils index 7287b060f..e55fed443 100644 --- a/test/shell-utils +++ b/test/shell-utils @@ -6,11 +6,15 @@ [ "$program" ] || program=${0##*/} +function die() { + echo "$program: Error: $*" 1>&2; + exit 2 +} + function err() { echo "$program: Error: $*" 1>&2; exit 2 } -alias die='err' function warn() { echo "$program: Warning: $*" 1>&2; diff --git a/test/show-mods b/test/show-mods new file mode 100755 index 000000000..6bb0a92a6 --- /dev/null +++ b/test/show-mods @@ -0,0 +1,61 @@ +#!/bin/bash + +# Since it's a pain to manually update the acceptable diffs, this script will pick +# new and modified diffs from the buildbot results, massage them slightly, display +# the difference between the old and new (or the new if no old one) and ask +# whether the diff should be updated. +# +# This script assumes that buildbot log files are available in $bblogdir; this +# will be true only on the buildbot master. + +program=${0##*/} +progdir=${0%/*} + +bblogdir=/var/lib/buildbot/master/ietfdb/builder1 +diffdir=$progdir/diff + +function die() { echo "$program: $*"; echo "Terminating"; exit 1; } + +sudo chown buildbot:staff -R $bblogdir +sudo chmod g+rw -R $bblogdir + +latest=$(ls $bblogdir | egrep "^[0-9]+$" | sort -nr | head -n 1) + +modprefix="$bblogdir/$latest-log-django-test-mod_" + +if ls $modprefix* > /dev/null; then + for mod in $modprefix*; do + diff="$diffdir/${mod#$modprefix}" + [ -f $diff ] || echo "Missing diff-file: $diff" + temp="/tmp/${mod##*/}" + tail -n +3 $mod | head -n -1 | tr -d "\r" > $temp + echo "========================================================================" + echo " ${diff##*/}" + echo "------------------------------------------------------------------------" + if diff $diff $temp | grep -v "\ No newline at end of file"; then + echo "" + read -p "Update diff [y/N]?" update + if [ "$update" = "Y" -o "$update" = "y" -o "$update" = "yes" ]; then cp $temp $diff; fi + fi + rm $temp + done +fi + +modprefix="$bblogdir/$latest-log-django-test-diff_" + +if ls $modprefix* > /dev/null; then + for mod in $modprefix*; do + diff="$diffdir/${mod#$modprefix}" + [ -f $diff ] && die "Diff-file $diff exists when it shouldn't..." + temp="/tmp/${mod##*/}" + tail -n +3 $mod | head -n -1 | tr -d "\r" > $temp + echo "========================================================================" + echo " ${diff##*/}" + echo "------------------------------------------------------------------------" + cat $temp + echo "" + read -p "Create diff [y/N]?" update + if [ "$update" = "Y" -o "$update" = "y" -o "$update" = "yes" ]; then cp $temp $diff; fi + rm $temp + done +fi \ No newline at end of file diff --git a/test/show-times b/test/show-times new file mode 100755 index 000000000..12bee937f --- /dev/null +++ b/test/show-times @@ -0,0 +1,32 @@ +#!/bin/bash + +# Since it's a pain to manually update the acceptable diffs, this script will pick +# new and modified diffs from the buildbot results, massage them slightly, display +# the difference between the old and new (or the new if no old one) and ask +# whether the diff should be updated. +# +# This script assumes that buildbot log files are available in $bblogdir; this +# will be true only on the buildbot master. + +program=${0##*/} +progdir=${0%/*} + +bblogdir=/var/lib/buildbot/master/ietfdb/builder1 + +function die() { echo "$program: $*"; echo "Terminating"; exit 1; } + +sudo chown buildbot:staff -R $bblogdir +sudo chmod g+rw -R $bblogdir + +latest=$(ls $bblogdir | egrep "^[0-9]+$" | sort -nr | head -n 1) + +function urltimes() { + awk ' + /^OK/ { path = $3 } + /^ *2007-/ { time[path] = substr($2, 2) } + END { for (path in time) { printf "%8s %s\n", time[path], path } } + ' "$@" +} + +echo "Longest URL fetch times from build $latest:" +cat $bblogdir/$latest-log-django-test-stdio | tr -d "\r" | urltimes | sort -n | tail diff --git a/test/test-setup b/test/test-setup index 081613fc6..e6ace38e4 100755 --- a/test/test-setup +++ b/test/test-setup @@ -53,7 +53,12 @@ cat $settings_local test/settings_local_test.py > test/settings_local.py # Acquire lock, to prevent running test and database update at the same time -LOCKDIR=/var/lock/ietfdb +for dir in $DBLOCK /var/lock /var/state /var/run /var/tmp; do + [ -d $dir -a -w $dir ] && lock=$dir/ietfdb && break +done +[ "$lock" ] || die "Couldn't find a directory to keep lock in." + +LOCKDIR=$lock PIDFILE=$LOCKDIR/pid while true; do @@ -61,18 +66,17 @@ while true; do echo "$$" > $PIDFILE chmod a+rwx $LOCKDIR chmod a+rw $PIDFILE + echo $PIDFILE # tell caller about the pidfile break else pid=$(< $PIDFILE ) [ "$pid" ] || die "Couldn't read pidfile '$PIDFILE'" if kill -0 $pid; then - echo "Pidfile for process $pid exists, and process is running. Sleeping." + say "Pidfile for process $pid exists, and process is running. Sleeping." sleep 10 else - echo "Pidfile for process $pid exists, but process isn't running." - echo "Removing lock and old pid file $pidfile." - rm -rf $LOCKDIR - break + say "Pidfile for process $pid exists, but process doesn't seem to be running." + die "Remove lockdir $LOCKDIR and old pid file $pidfile." fi fi done diff --git a/test/update-db b/test/update-db index e6e983380..33e531068 100755 --- a/test/update-db +++ b/test/update-db @@ -21,11 +21,10 @@ done for dir in $DBLOCK /var/lock /var/state /var/run /var/tmp; do - [ -d $dir -a -w $dir ] && lock=$dir/$program && break + [ -d $dir -a -w $dir ] && lock=$dir/ietfdb && break done [ "$lock" ] || die "Couldn't find a directory to keep lock in." - [ "$DBDUMP" ] || DBDUMP="$1" [ "$DBDUMP" ] || DBDUMP=/www/tools.ietf.org/events/raw/sqldump/sqldump.raw [ "$DBFIX" ] || DBFIX=$build/test/sql_fixup.sql @@ -33,7 +32,6 @@ done [ "$DBDONE" ] || DBDONE=$state/update-db.done [ "$DBLOCK" ] || DBLOCK=$lock - PIDFILE=$DBLOCK/pid while true; do @@ -45,6 +43,7 @@ while true; do #echo "Last update done $(date -r $DBDONE +'%Y-%m-%d %H:%M')." if [ $DBDUMP -nt $DBTIME ]; then echo "Updating database dated $(date -r $DBDONE +'%Y-%m-%d %H:%M') from dump with time $(date -r $DBDUMP +'%Y-%m-%d %H:%M')" + echo -n "Updating database from dump with time $(date -r $DBDUMP +'%Y-%m-%d %H:%M')... " 1>&2 echo "$$" > $PIDFILE chmod a+rw $PIDFILE @@ -58,6 +57,7 @@ while true; do touch -r $DBDUMP $DBTIME touch $DBDONE echo "Done." + echo "Done." 1>&2 else echo "Database is up-to-date (updated $(date -r $DBDONE +'%Y-%m-%d %H:%M') from dump with time $(date -r $DBDUMP +'%Y-%m-%d %H:%M'))" fi