Gentoo Archives: gentoo-commits

From: "Ulrich Mueller (ulm)" <ulm@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] eselect r503 - in trunk: . libs man modules
Date: Sat, 25 Apr 2009 13:59:37
Message-Id: E1LxiPn-0000J3-HH@stork.gentoo.org
1 Author: ulm
2 Date: 2009-04-25 13:59:35 +0000 (Sat, 25 Apr 2009)
3 New Revision: 503
4
5 Added:
6 trunk/man/news-tng.eselect.5
7 trunk/modules/news-tng.eselect
8 Modified:
9 trunk/ChangeLog
10 trunk/libs/package-manager.bash.in
11 trunk/man/Makefile.am
12 trunk/modules/Makefile.am
13 Log:
14 Yet another module for reading GLEP 42 news items. Rewritten from scratch.
15 New function "get_repo_news_dir" in package-manager.bash.
16
17
18 Modified: trunk/ChangeLog
19 ===================================================================
20 --- trunk/ChangeLog 2009-04-25 13:03:44 UTC (rev 502)
21 +++ trunk/ChangeLog 2009-04-25 13:59:35 UTC (rev 503)
22 @@ -1,5 +1,14 @@
23 2009-04-25 Ulrich Mueller <ulm@g.o>
24
25 + * modules/news-tng.eselect: Yet another module for reading GLEP 42
26 + news items. Rewritten from scratch.
27 + * man/news-tng.eselect.5: New man page.
28 + * modules/Makefile.am (safe_scripts):
29 + * man/Makefile.am (man_MANS): Update.
30 +
31 + * libs/package-manager.bash.in (get_repo_news_dir): New function.
32 + (get_news_dir_name): Call get_repo_news_dir.
33 +
34 * libs/Makefile.am (dosed): Remove Paludis substitution, it is
35 unused since the change of 2008-01-28.
36
37
38 Modified: trunk/libs/package-manager.bash.in
39 ===================================================================
40 --- trunk/libs/package-manager.bash.in 2009-04-25 13:03:44 UTC (rev 502)
41 +++ trunk/libs/package-manager.bash.in 2009-04-25 13:59:35 UTC (rev 503)
42 @@ -40,7 +40,7 @@
43 sparc*) ret=sparc ;;
44 x86_64) ret=amd64 ;;
45 *) write_warning_msg \
46 - "Unknown architecture. Please submit a bug including the output of 'uname -m'!"
47 + "Unknown architecture. Please submit a bug including the output of 'uname -m'"
48 return 1
49 ;;
50 esac
51 @@ -52,7 +52,7 @@
52 OpenBSD) suffix="-obsd" ;;
53 DragonFly) suffix="-dfly" ;;
54 *) write_warning_msg \
55 - "Unknown OS. Please submit a bug including the output of 'uname -s'!"
56 + "Unknown OS. Please submit a bug including the output of 'uname -s'"
57 return 1
58 ;;
59 esac
60 @@ -64,7 +64,7 @@
61 # best-version
62 # Return true if package $2 is available in ${ROOT}
63 best-version() {
64 - [[ $# -eq 1 ]] || die "has_version expects exactly 1 arguments!"
65 + [[ $# -eq 1 ]] || die "has_version expects exactly one argument"
66
67 local manager=$(package-manager)
68 case ${manager} in
69 @@ -75,7 +75,7 @@
70 portageq has_version "${ROOT}" "${1}" 2>/dev/null
71 ;;
72 *)
73 - die "Unknown package manager: \"${manager}\"!"
74 + die "Unknown package manager: \"${manager}\""
75 esac
76 }
77
78 @@ -83,7 +83,7 @@
79 # Return the contents of environment variable $2 as seen by package manager(s)
80 # for package $1.
81 envvar() {
82 - [[ $# -eq 2 ]] || die "envvar expects exactly 2 arguments!"
83 + [[ $# -eq 2 ]] || die "envvar expects exactly 2 arguments"
84
85 local manager=$(package-manager)
86 case ${manager} in
87 @@ -95,14 +95,14 @@
88 portageq envvar "${2}" 2>/dev/null
89 ;;
90 *)
91 - die "Unknown package manager: \"${manager}\"!"
92 + die "Unknown package manager: \"${manager}\""
93 esac
94 }
95
96 # has-version
97 # Return true if package $2 is available in ${ROOT}
98 has-version() {
99 - [[ $# -eq 1 ]] || die "has_version expects exactly 1 arguments!"
100 + [[ $# -eq 1 ]] || die "has_version expects exactly one argument"
101
102 local manager=$(package-manager)
103 case ${manager} in
104 @@ -115,7 +115,7 @@
105 return $?
106 ;;
107 *)
108 - die "Unknown package manager: \"${manager}\"!"
109 + die "Unknown package manager: \"${manager}\""
110 esac
111 }
112
113 @@ -131,27 +131,34 @@
114 done
115 ;;
116 *)
117 - die "Unknown package manager: \"${manager}\"!"
118 + die "Unknown package manager: \"${manager}\""
119 esac
120 }
121
122 -get_news_dir_name() {
123 - [[ $# -eq 1 ]] || die "get_news_dir_name expects exactly 1 argument!"
124 -
125 - local name=${1%::*} repo=${1##*::}
126 +# get_repo_news_dir
127 +# return the directory where to find GLEP 42 news items for repository $1
128 +get_repo_news_dir() {
129 + [[ $# -eq 1 ]] || die "get_repo_news_dir expects exactly one argument"
130 + local repo=$1
131 local manager=$(package-manager)
132 case ${manager} in
133 paludis)
134 - echo "$($(paludis_command) --configuration-variable ${repo} newsdir)/${name}"
135 + $(paludis_command) --configuration-variable ${repo} newsdir
136 ;;
137 portage)
138 - echo "$(portage_get_repository ${repo})/metadata/news/${name}"
139 + echo "$(portage_get_repository ${repo})/metadata/news"
140 ;;
141 *)
142 - die "Unknown package manager: \"${manager}\"!"
143 + die "Unknown package manager: \"${manager}\""
144 esac
145 }
146
147 +get_news_dir_name() {
148 + [[ $# -eq 1 ]] || die "get_news_dir_name expects exactly one argument"
149 + local name=${1%::*} repo=${1##*::}
150 + echo "$(get_repo_news_dir "${repo}")/${name}"
151 +}
152 +
153 # package-manager PRIVATE
154 # Return the package manager we're going to use.
155 package-manager() {
156 @@ -172,6 +179,8 @@
157 fi
158
159 echo ${manager}
160 + # caching doesn't really work: we are typically called with
161 + # command substitution, i.e. in a subshell
162 ESELECT_PACKAGE_MANAGER=${manager}
163 }
164
165
166 Modified: trunk/man/Makefile.am
167 ===================================================================
168 --- trunk/man/Makefile.am 2009-04-25 13:03:44 UTC (rev 502)
169 +++ trunk/man/Makefile.am 2009-04-25 13:59:35 UTC (rev 503)
170 @@ -5,6 +5,7 @@
171 env.eselect.5 \
172 kernel.eselect.5 \
173 mailer.eselect.5 \
174 + news-tng.eselect.5 \
175 pager.eselect.5 \
176 profile.eselect.5 \
177 rc.eselect.5 \
178
179 Added: trunk/man/news-tng.eselect.5
180 ===================================================================
181 --- trunk/man/news-tng.eselect.5 (rev 0)
182 +++ trunk/man/news-tng.eselect.5 2009-04-25 13:59:35 UTC (rev 503)
183 @@ -0,0 +1,82 @@
184 +.\" Copyright 2009 Gentoo Foundation
185 +.\" Distributed under the terms of the GNU General Public License v2
186 +.\" $Id$
187 +.\"
188 +.TH news-tng.eselect 5 "April 2009" "Gentoo Linux" eselect
189 +.SH NAME
190 +news-tng.eselect \- Yet another GLEP 42 news module for Gentoo's eselect
191 +.SH SYNOPSIS
192 +.B eselect news-tng
193 +.RB [ help | usage | version ]
194 +.br
195 +.B eselect news-tng list
196 +.br
197 +.B eselect news-tng read
198 +.RI [ item ...]
199 +.br
200 +.B eselect news-tng unread
201 +.RI [ item ...]
202 +.br
203 +.B eselect news-tng purge
204 +.br
205 +.B eselect news-tng count
206 +.RB [ new | all ]
207 +.SH DESCRIPTION
208 +.B eselect
209 +is Gentoo's configuration and management tool. It features modules
210 +that care for the individual administrative tasks.
211 +.SH ACTION: LIST
212 +.B eselect news-tng list
213 +.br
214 +List all Gentoo news items.
215 +
216 +# eselect news-tng list
217 +.br
218 +News items:
219 +.br
220 + [1] 2009-04-18 (unread) Generation 1 Java Setup Deprecated
221 + [2] 2009-04-06 (read) Migration from teTeX to TeXLive
222 + [3] 2009-04-06 (read) Migration to X.org Server 1.5
223 +.SH ACTION: READ
224 +.B eselect news-tng read
225 +.RI [ item ...]
226 +.br
227 +Read news item(s), selected by their
228 +.I item
229 +number(s) from the
230 +.B list
231 +action. Special items
232 +.B new
233 +and
234 +.B all
235 +select all unread items or all items, respectively.
236 +.SH ACTION: UNREAD
237 +.B eselect news-tng unread
238 +.RI [ item ...]
239 +.br
240 +Mark news item(s) as unread again. Items are selected by their
241 +.I item
242 +number(s) from the
243 +.B list
244 +action. Special item
245 +.B all
246 +selects all items.
247 +.SH ACTION: PURGE
248 +.B eselect news-tng purge
249 +.br
250 +Purge all read news item(s).
251 +.SH ACTION: COUNT
252 +.B eselect news-tng count
253 +.RB [ new | all ]
254 +.br
255 +Display number of unread news items (default) or of all news items,
256 +if option
257 +.B all
258 +is given.
259 +.SH AUTHOR
260 +Ulrich Mueller <ulm@g.o>
261 +.SH SEE ALSO
262 +.BR eselect (1),
263 +http://www.gentoo.org/proj/en/glep/glep-0042.html
264 +.SH REVISION
265 +$Id$
266
267
268 Property changes on: trunk/man/news-tng.eselect.5
269 ___________________________________________________________________
270 Name: svn:keywords
271 + Id
272
273 Modified: trunk/modules/Makefile.am
274 ===================================================================
275 --- trunk/modules/Makefile.am 2009-04-25 13:03:44 UTC (rev 502)
276 +++ trunk/modules/Makefile.am 2009-04-25 13:59:35 UTC (rev 503)
277 @@ -8,6 +8,7 @@
278 kernel.eselect \
279 mailer.eselect \
280 modules.eselect \
281 + news-tng.eselect \
282 pager.eselect \
283 profile.eselect \
284 rc.eselect \
285
286 Added: trunk/modules/news-tng.eselect
287 ===================================================================
288 --- trunk/modules/news-tng.eselect (rev 0)
289 +++ trunk/modules/news-tng.eselect 2009-04-25 13:59:35 UTC (rev 503)
290 @@ -0,0 +1,293 @@
291 +# Copyright 2005-2009 Gentoo Foundation
292 +# Distributed under the terms of the GNU General Public License v2
293 +# $Id$
294 +
295 +inherit package-manager
296 +
297 +DESCRIPTION="Read Gentoo (\"GLEP 42\") news items"
298 +MAINTAINER="ulm@g.o"
299 +SVN_DATE='$Date$'
300 +VERSION=$(svn_date_to_version "${SVN_DATE}")
301 +
302 +NEWS_DIR="/var/lib/gentoo/news"
303 +
304 +# read list of news items
305 +# list of parameters may contain "unread" or "read"
306 +# returns one item per line: status/repository/name
307 +# sort order: 1. "unread" before "read", 2. by repository
308 +find_items() {
309 + local stat repo item
310 + local -a repos=( $(get_repositories) )
311 + for stat in "$@"; do
312 + for repo in ${repos[@]}; do
313 + file="${ROOT}${NEWS_DIR}/news-${repo}.${stat}"
314 + [[ -f ${file} ]] || continue
315 + for item in $(<"${file}"); do
316 + echo "${stat}/${repo}/${item}"
317 + done
318 + done
319 + done
320 +}
321 +
322 +# write list of items to file
323 +# first parameter is "unread" or "read"
324 +# second parameter is the repository
325 +# list of items is expected in global array "items"
326 +write_item_list() {
327 + local stat=$1 repo=$2 item update
328 + for item in ${items[@]}; do
329 + [[ ${item%%/*} = ${stat} ]] || continue
330 + item=${item#*/}
331 + [[ ${item%%/*} = ${repo} ]] && update="${update} ${item#*/}"
332 + done
333 + file="${ROOT}${NEWS_DIR}/news-${repo}.${stat}"
334 + if [[ ! -w ${file} ]]; then
335 + write_error_msg \
336 + "Cannot update list of news items for repository \"${repo}\""
337 + return 1
338 + fi
339 + for item in ${update}; do
340 + echo "${item}"
341 + done >"${file}" || die "Error writing file ${file}"
342 +}
343 +
344 +# read a given item
345 +# first parameter is the directory
346 +# second parameter is the item's name
347 +# optional third parameter may be "header", "body", or "existsp"
348 +read_item() {
349 + local dir=$1 item=$2 what=$3 file lang command=""
350 + for lang in $(accepted_languages); do
351 + file="${ROOT}${dir}/${item}/${item}.${lang}.txt"
352 + [[ -f "${file}" ]] || continue
353 + case "${what}" in
354 + header) command="/^$/Q" ;;
355 + body) command="0,/^$/d" ;;
356 + existsp) return 0 ;;
357 + esac
358 + sed -e "${command}" "${file}" || die "Error reading ${file}"
359 + return
360 + done
361 + return 1
362 +}
363 +
364 +# find directory for a given repository (and cache it)
365 +# affects variable "dir" and arrays "repos" and "dirs" by side effect
366 +find_repo_dir() {
367 + local repo=$1 i
368 + for (( i = 0; i < ${#repos[@]}; i++ )); do
369 + [[ ${repos[i]} = ${repo} ]] && break
370 + done
371 + if [[ ${i} -eq ${#repos[@]} ]]; then
372 + repos[i]=${repo}
373 + dirs[i]=$(get_repo_news_dir "${repo}")
374 + fi
375 + dir=${dirs[i]}
376 +}
377 +
378 +# return list of accepted languages
379 +accepted_languages() {
380 + local lc=${LC_ALL:-${LANG}}
381 + lc=${lc%%[^[:alpha:]]*}
382 + [[ -n ${lc} && ${lc} != en ]] && echo ${lc}
383 + echo en
384 +}
385 +
386 +### list action
387 +
388 +describe_list() {
389 + echo "List news items"
390 +}
391 +
392 +do_list() {
393 + package-manager &>/dev/null # for internal caching
394 + local item stat repo dir header line title posted i=1
395 + local ifs_save=${IFS-$' \t\n'}
396 + local -a repos dirs
397 +
398 + set -- $(find_items unread read)
399 + write_list_start "News items:"
400 + for item in "$@"; do
401 + stat=${item%%/*}; item=${item#*/}
402 + repo=${item%%/*}; item=${item#*/}
403 + find_repo_dir ${repo}
404 + header=$(read_item "${dir}" ${item} header)
405 + IFS=$'\n'
406 + for line in ${header}; do
407 + case "${line%%: *}" in
408 + Title) title=${line#*: } ;;
409 + Posted) posted=${line#*: } ;;
410 + esac
411 + done
412 + IFS=${ifs_save}
413 + if [[ ${stat} = unread ]]; then
414 + write_numbered_list_entry \
415 + $((i++)) "$(highlight "${posted## } (unread) ${title## }")"
416 + else
417 + write_numbered_list_entry \
418 + $((i++)) "${posted## } (read) ${title## }"
419 + fi
420 + done
421 + [[ $# -eq 0 ]] && write_kv_list_entry "(none found)" ""
422 +}
423 +
424 +### count action
425 +
426 +describe_count() {
427 + echo "Display number of news items"
428 +}
429 +
430 +describe_count_options() {
431 + echo "new : Count unread news items (default)"
432 + echo "all : Count all news items"
433 +}
434 +
435 +do_count() {
436 + local status
437 + [[ $1 = all ]] && status="unread read" || status="unread"
438 + set -- $(find_items ${status})
439 + echo $#
440 +}
441 +
442 +### read action
443 +
444 +describe_read() {
445 + echo "Read news items"
446 +}
447 +
448 +describe_read_options() {
449 + echo "new : Read unread news items"
450 + echo "all : Read all news items"
451 + echo "item : Number of item (from 'list' action)"
452 +}
453 +
454 +describe_read_parameters() {
455 + echo "<item>..."
456 +}
457 +
458 +do_read() {
459 + package-manager &>/dev/null # for internal caching
460 + local -a items=( $(find_items unread read) ) repos dirs
461 + local n=${#items[@]} item repo stat dir header line i seq repos_upd
462 + local ifs_save=${IFS-$' \t\n'}
463 +
464 + # expand special values "new" and "all"
465 + if [[ $1 = new || $1 = all ]]; then
466 + for (( i = 1; i <= n; i++ )); do
467 + [[ $1 = new && ${items[i-1]%%/*} != unread ]] && break
468 + seq="${seq} ${i}"
469 + done
470 + set -- ${seq}
471 + fi
472 +
473 + for i in "$@"; do
474 + if ! is_number "${i}" || [[ ${i} -lt 1 || ${i} -gt ${#items[@]} ]]
475 + then
476 + write_warning_msg "Bad item number: ${i}"
477 + continue
478 + fi
479 + item=${items[--i]}
480 + stat=${item%%/*}; item=${item#*/}
481 + repo=${item%%/*}; item=${item#*/}
482 + find_repo_dir ${repo}
483 + write_list_start "${item}"
484 + header=$(read_item "${dir}" "${item}" header)
485 + IFS=$'\n'
486 + for line in ${header}; do
487 + case "${line%%: *}" in
488 + Title)
489 + write_kv_list_entry \
490 + "${line%%: *}" "$(highlight "${line#*: }")" ;;
491 + Author|Posted|Revision)
492 + write_kv_list_entry "${line%%: *}" "${line#*: }" ;;
493 + esac
494 + done
495 + IFS=${ifs_save}
496 + echo
497 + read_item "${dir}" "${item}" body
498 + echo
499 +
500 + [[ ${stat} = unread ]] || continue
501 + # move from "unread" to "read"
502 + unset items[i]
503 + items[n++]=read/${repo}/${item}
504 + has ${repo} ${repos_upd} || repos_upd="${repos_upd} ${repo}"
505 + done
506 +
507 + # update lists of read/unread items
508 + for repo in ${repos_upd}; do
509 + write_item_list read ${repo} && write_item_list unread ${repo}
510 + done
511 +}
512 +
513 +### unread action
514 +
515 +describe_unread() {
516 + echo "Mark read news items as unread again"
517 +}
518 +
519 +describe_unread_options() {
520 + echo "all : Mark all news items as unread"
521 + echo "item : Number of item (from 'list' action)"
522 +}
523 +
524 +describe_unread_parameters() {
525 + echo "<item>..."
526 +}
527 +
528 +do_unread() {
529 + local -a items=( $(find_items unread read) )
530 + local n=${#items[@]} item repo stat i seq repos_upd
531 +
532 + # expand special value "all"
533 + if [[ $1 = all ]]; then
534 + for (( i = 1; i <= n; i++ )); do
535 + seq="${seq} ${i}"
536 + done
537 + set -- ${seq}
538 + fi
539 +
540 + for i in "$@"; do
541 + if ! is_number "${i}" || [[ ${i} -lt 1 || ${i} -gt ${#items[@]} ]]
542 + then
543 + write_warning_msg "Bad item number: ${i}"
544 + continue
545 + fi
546 + item=${items[--i]}
547 + stat=${item%%/*}; item=${item#*/}
548 + repo=${item%%/*}; item=${item#*/}
549 + [[ ${stat} = read ]] || continue
550 + # move from "read" to "unread"
551 + unset items[i]
552 + items[n++]=unread/${repo}/${item}
553 + has ${repo} ${repos_upd} || repos_upd="${repos_upd} ${repo}"
554 + done
555 +
556 + # update lists of unread/read items
557 + for repo in ${repos_upd}; do
558 + write_item_list unread ${repo} && write_item_list read ${repo}
559 + done
560 +}
561 +
562 +### purge action
563 +
564 +describe_purge() {
565 + echo "Purge read news"
566 +}
567 +
568 +do_purge() {
569 + local -a items=( $(find_items read) )
570 + local item i repos
571 +
572 + # find repos with nonempty lists
573 + for (( i = 0; i < ${#items[@]}; i++ )); do
574 + item=${items[i]#*/}
575 + has ${item%%/*} ${repos} || repos="${repos} ${item%%/*}"
576 + done
577 +
578 + # purge list of read items
579 + items=()
580 + for repo in ${repos}; do
581 + write_item_list read ${repo}
582 + done
583 +}
584
585
586 Property changes on: trunk/modules/news-tng.eselect
587 ___________________________________________________________________
588 Name: svn:keywords
589 + Author Date Id Revision